web-dev-qa-db-ja.com

log4jコンソールアペンダーに、スレッドごとに異なる色を使用させる

私はいくつかの並行性の問題を追跡していますが、コンソールにログインするときに各スレッドからの出力行を異なる色にすることは非常に役立ちます。私は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の行は異なる色にする必要があります。

37
David Tinker

PatternLayout を拡張し、 format(ILoggingEvent) をオーバーライドできます。そこで、スレッド名に基づいて色を取得するために LoggingEvent.getThreadName() を見ることができます(奇数/偶数かもしれません)。

コンソールに色を出力するには、 ANSIエスケープシーケンス を使用する必要があります。

たとえば、赤いテキストを出力するには:

  "\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でFilterなどのランダムなANSIカラーコードを持つ変数 "randColor"を設定し、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] 「\ u001B [J」は何を表していますか?

24
Xavi López

MulticolorLayout from 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>

この例では、%pDEBUGINFOERRORなどに置き換えられ、ログレベルに関連する色にペイントされます。それに加えて、独自の色または事前定義された色を使用することができます、例えば:

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カラー に関する詳細なドキュメント。

42
yegor256