让log4j控制台输出器对不同线程使用不同颜色

50

我正在追踪一些并发问题,如果日志记录到控制台时每个线程的输出行可以用不同的颜色表示,将非常有帮助。我使用的操作系统是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的线条应该使用不同的颜色。

3个回答

47

您可以使用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颜色的更多文档。


添加了一个更高级的log4j示例和一个输出示例。我对这个解决方案感到非常满意,我想为其他人节省处理ansi颜色、日志级别、转换模式颜色和测试的时间。在Eclipse和ANSICON上的Ansi控制台中进行了测试。 - ggb667
0.15 是当前版本。 - ggb667

31
你可以扩展 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中设置一个名为 "randColor" 的随机ANSI颜色代码变量,在Filter中使用它,并在log4j的控制台appender配置中的标准org.apache.log4j.PatternLayoutconversionPattern中使用它来实现此目的。

<appender name="consoleAppender" class="org.apache.log4j.ConsoleAppender">
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern"
               value="\u001b[0;%X{randColor}m ....... \u001b[m" />
    </layout>
</appender>

[1] "\u001B[J"代表什么意思?


3
我不想通过在日志消息中添加各种格式来“损坏”输出日志,因为这些日志消息也会写入文件。我希望这可以通过配置日志系统来完成,并仅适用于控制台记录器。 - David Tinker
5
"[...]登入控制台时颜色不同[...]" - Tomasz Nurkiewicz
5
【MacOS终端提示】要获得更多颜色,您可以这样做:\u001b[0;38;2;233;235;235m....您的文本....\u001b[m。有关详细信息,请参阅https://en.wikipedia.org/wiki/ANSI_escape_code,并搜索`38;2;<r>;<g>;<b>`我在寻找终端中的彩色文本时发现了这个线程,本篇文章对我很有帮助,所以我分享了这个小贴士 - Maxence

3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接