【问题标题】:Making a log4j console appender use different colors for different threads使 log4j 控制台附加程序为不同的线程使用不同的颜色
【发布时间】:2011-12-12 11:54:25
【问题描述】:

我正在跟踪一些并发问题,当登录到控制台时,让每个线程的输出行以不同的颜色显示会非常有帮助。我在 OS X 上。这可以使用转换模式来输出一些控制代码还是需要自定义附加程序来完成?有人知道怎么做吗?

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 的行应该是不同的颜色。

【问题讨论】:

    标签: java console log4j


    【解决方案1】:

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

    <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 的文档。

    【讨论】:

    • 添加了更高级的 log4j 示例和示例输出。我对这个解决方案非常满意,并且我想节省其他人必须处理 ansi 颜色、日志记录级别、转换模式颜色和测试。在 Eclipse 和 ANSICON 上的 Ansi 控制台中测试。
    • 0.15 是当前版本。
    【解决方案2】:

    您可以扩展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 中,并在标准的conversionPattern 中使用它org.apache.log4j.PatternLayout 在 log4j 的控制台附加配置中:

    <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]What does "\u001B[J" represent?

    【讨论】:

    • 我不想通过向日志消息添加各种格式来“损坏”输出日志,因为日志消息也会发送到文件中。我希望通过配置日志系统来完成此操作,并且仅适用于控制台记录器。
    • "[...]不同的颜色**登录到控制台时**[...]"
    • [在 Macos 终端上工作的提示] 要获得更多颜色,您可以这样做:\u001b[0;38;2;233;235;235m....your text....\u001b[m 有关详细信息,请参阅 en.wikipedia.org/wiki/ANSI_escape_code 并搜索 38;2;&lt;r&gt;;&lt;g&gt;;&lt;b&gt; 在查找彩色文本时发现此线程在终端中,这篇文章帮助了我,所以我分享了这个小技巧
    【解决方案3】:

    参见 PatternLayout,配置属性“highlight”:https://logging.apache.org/log4j/2.x/manual/layouts.html#PatternLayout

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多