Заставить консольный приложение log4j использовать разные цвета для разных потоков - PullRequest
35 голосов
/ 21 октября 2011

Я отслеживаю некоторые проблемы параллелизма, и было бы очень полезно иметь выходные строки из каждого потока разного цвета при входе в консоль. Я на 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 должны быть разных цветов.

Ответы [ 2 ]

41 голосов
/ 30 августа 2012

Вы можете использовать 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 будет заменен на DEBUG, INFO, ERROR и т. д., а затем окрашен в цвет, соответствующий уровню ведения журнала.Кроме того, вы можете использовать свои собственные цвета или предопределенные цвета, например:

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-цветах .

24 голосов
/ 21 октября 2011

Вы можете расширить 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, и используя ее в 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"?

...