从零开发短视频电商 非SpringBoot项目Logback配置以及彩色控制台

AnsiColor

AnsiColor是一种文本颜色编码系统,它可以通过在文本中插入特殊的控制字符来改变文本的颜色、背景色和其他样式属性。这种编码系统最初是由ANSI(美国国家标准协会)开发的,因此得名为“ANSI color”。不过,它后来已经被广泛应用于许多不同的操作系统和软件中。

在AnsiColor中,每种颜色都有一个数字代码表示。例如,红色的代码为31,绿色的代码为32,黄色的代码为33,蓝色的代码为34,等等。通过在文本中插入类似于“\033[31m”这样的控制字符,就可以将文本颜色设置为红色。类似地,可以使用其他代码设置背景色、粗体、斜体、下划线等属性。

以 ESC(Escape)字符(十六进制为0x1B,或者八进制为033)开头,后跟一些指令来设置文本的颜色、背景色、样式等等。

    DEFAULT("39"),

	BLACK("30"),

	RED("31"),

	GREEN("32"),

	YELLOW("33"),

	BLUE("34"),

	MAGENTA("35"),

	CYAN("36"),

	WHITE("37"),

	BRIGHT_BLACK("90"),

	BRIGHT_RED("91"),

	BRIGHT_GREEN("92"),

	BRIGHT_YELLOW("93"),

	BRIGHT_BLUE("94"),

	BRIGHT_MAGENTA("95"),

	BRIGHT_CYAN("96"),

	BRIGHT_WHITE("97");

举例颜色输出

 System.out.println("\033[31m" + "你好laker"); // \033[31m 表示为红色
 System.out.println("\033[32m" + "你好laker"); // 绿色
 System.out.println("\033[33m" + "你好laker" + "\033[0;39m"); // 黄色 + 结束为默认
 System.out.println("你好laker"); // 默认

重置回默认值,可以使用代码\033[0m

集成

依赖

1.添加依赖

<dependency>
     <groupId>ch.qos.logback</groupId>
     <artifactId>logback-classic</artifactId>
     <version>1.2.3</version>
</dependency>

扩展

public class ColorConverter extends CompositeConverter<ILoggingEvent> {
    
    
    private static final Map<Integer, AnsiColor> LEVELS;
    static {
    
    
        Map<Integer, AnsiColor> ansiLevels = new HashMap<>();
        ansiLevels.put(Level.ERROR_INTEGER, AnsiColor.RED);
        ansiLevels.put(Level.WARN_INTEGER, AnsiColor.YELLOW);
        ansiLevels.put(Level.DEBUG_INTEGER, AnsiColor.CYAN);
        LEVELS = Collections.unmodifiableMap(ansiLevels);
    }
    @Override
    protected String transform(ILoggingEvent event, String in) {
    
    
        // Assume highlighting
        AnsiColor element = LEVELS.get(event.getLevel().toInteger());
        element = (element != null) ? element : AnsiColor.GREEN;
        return toAnsiString(in, element);
    }
    protected String toAnsiString(String in, AnsiColor element) {
    
    
        return AnsiOutput.toString(element, in);
    }
}

public abstract class AnsiOutput {
    
    
    private static final String ENCODE_JOIN = ";";
    private static final String ENCODE_START = "\033[";
    private static final String ENCODE_END = "m";
    private static final String RESET = "0;" + AnsiColor.DEFAULT;
    public static String toString(Object... elements) {
    
    
        StringBuilder sb = new StringBuilder();
        buildEnabled(sb, elements);
        return sb.toString();
    }
    private static void buildEnabled(StringBuilder sb, Object[] elements) {
    
    
        boolean writingAnsi = false;
        boolean containsEncoding = false;
        for (Object element : elements) {
    
    
            if (element instanceof AnsiColor) {
    
    
                containsEncoding = true;
                if (!writingAnsi) {
    
    
                    sb.append(ENCODE_START);
                    writingAnsi = true;
                } else {
    
    
                    sb.append(ENCODE_JOIN);
                }
            } else {
    
    
                if (writingAnsi) {
    
    
                    sb.append(ENCODE_END);
                    writingAnsi = false;
                }
            }
            sb.append(element);
        }
        if (containsEncoding) {
    
    
            sb.append(writingAnsi ? ENCODE_JOIN : ENCODE_START);
            sb.append(RESET);
            sb.append(ENCODE_END);
        }
    }
}

public enum AnsiColor {
    
    

    DEFAULT("39"),

    BLACK("30"),

    RED("31"),

    GREEN("32"),

    YELLOW("33"),

    BLUE("34"),

    MAGENTA("35"),

    CYAN("36"),

    WHITE("37"),

    BRIGHT_BLACK("90"),

    BRIGHT_RED("91"),

    BRIGHT_GREEN("92"),

    BRIGHT_YELLOW("93"),

    BRIGHT_BLUE("94"),

    BRIGHT_MAGENTA("95"),

    BRIGHT_CYAN("96"),

    BRIGHT_WHITE("97");

    private final String code;
    AnsiColor(String code) {
    
    
        this.code = code;
    }
    @Override
    public String toString() {
    
    
        return this.code;
    }
}

配置

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <property name="LOG_HOME" value="logs"/>
    <property name="encoding" value="UTF-8"/>
    <conversionRule conversionWord="clr" converterClass="com.cisco.fuego.logback.ColorConverter"/>
    <appender name="DEFAULT" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/tracker-server.log</file>
        <Append>true</Append>
        <prudent>false</prudent>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{50} - %m%n</pattern>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>${LOG_HOME}/tracker-server-%d{yyyy-MM-dd}-%i.log</FileNamePattern>
            <maxHistory>10</maxHistory>
            <totalSizeCap>3GB</totalSizeCap>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>5MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
    </appender>


    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %clr([%t]) %clr(%-5level) %logger{50} - %m%n</pattern>
        </encoder>
    </appender>
    <logger name="com.cisco.fuego" level="DEBUG"/>
    <root level="INFO">
        <appender-ref ref="DEFAULT"/>
        <appender-ref ref="STDOUT"/>
    </root>
</configuration>

配置动态生效

logback可以实现自动刷新logback.xml配置,配置如下

 <configuration scan="true" scanPeriod="10 seconds" debug="true">
 </configuration >

参数描述:

  • scan=“true” 启动动态刷新
  • scanPeriod=“10 seconds” 刷新频率 10s每次
  • seconds" debug=“true” 开启动态刷新日志,有变动会触发日志

猜你喜欢

转载自blog.csdn.net/abu935009066/article/details/129856554