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” 开启动态刷新日志,有变动会触发日志