使log4j控制台appender为不同的线程使用不同的颜色

时间:2011-10-21 10:45:42

标签: java console log4j

我正在追踪一些并发问题,在登录到控制台时,让每个线程的输出行以不同的颜色非常有用。我在OS X上。可以使用转换模式输出一些控制代码,还是需要自定义appender?谁知道怎么做?

2011-10-21 12:14:42,859 ["http-bio-8080"-exec-9] DEBUG ...
2011-10-21 12:14:43,198 ["http-bio-8080"-exec-10] DEBUG ...

exec-9和exec-10的行应该有不同的颜色。

2 个答案:

答案 0 :(得分:41)

您可以使用MulticolorLayout中的jcabi-log。将此依赖项添加到项目中:

<dependency>
  <groupId>com.jcabi</groupId>
  <artifactId>jcabi-log</artifactId>
  <version>0.17.1</version>
</dependency>

然后在log4j.properties中配置它:

log4j.rootLogger=INFO, CONSOLE
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=com.jcabi.log.MulticolorLayout
log4j.appender.CONSOLE.layout.ConversionPattern=[%color{%p}] %c: %m%n

log4j.xml

相同
<appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
    <param name="Target" value="System.out" />
    <layout class="com.jcabi.log.MulticolorLayout">
        <param name="ConversionPattern" value="[%color{%p}] %m%n" />
    </layout>
</appender>

在此示例中,%p将替换为DEBUGINFOERROR等,然后绘制为与日志记录级别相关的颜色。除此之外,您还可以使用自己的颜色或预定义的颜色,例如:

log4j.appender.CONSOLE.layout.ConversionPattern=[%p] $color-cyan{%c}: %color-red{%m}%n
log4j.appender.CONSOLE.layout.ConversionPattern=[%p] $color-0;0;31{%c}: %m%n

有关ANSI colors的更多文档。

答案 1 :(得分:24)

您可以延长PatternLayout并覆盖format(ILoggingEvent)。在那里你可以看LoggingEvent.getThreadName()根据线程名称得到一些颜色(奇数/偶数,也许?)。

要将颜色输出到控制台,您需要使用ANSI Escape Sequence

例如,要输出红色文字:

  "\u001b["  // Prefix - see [1]
+ "0"        // Brightness
+ ";"        // Separator
+ "31"       // Red foreground
+ "m"        // Suffix
+ text       // the text to output
+ "\u001b[m " // Prefix + Suffix to reset color

这里有一些例子:

只是要添加,也许你也可以通过在MDC中设置一个带有随机ANSI颜色代码的变量“randColor”来实现这一点,例如,在Filter中,并在{{1}中使用它在log4j的控制台appender配置中标准conversionPattern

org.apache.log4j.PatternLayout

[1] What does "\u001B[J" represent?