web-dev-qa-db-fra.com

Faire un appender console log4j utiliser des couleurs différentes pour différents threads

Je traque certains problèmes de concurrence et il serait très utile d'avoir les lignes de sortie de chaque thread dans une couleur différente lors de la connexion à une console. Je suis sous OS X. Cela pourrait-il être fait en utilisant un modèle de conversion pour sortir certains codes de contrôle ou aurait-il besoin d'un appender personnalisé? Quelqu'un sait comment?

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 ...

Les lignes pour exec-9 et exec-10 doivent être de couleurs différentes.

37
David Tinker

Vous pouvez étendre PatternLayout et remplacer format(ILoggingEvent) . Là, vous pouvez regarder LoggingEvent.getThreadName() pour obtenir une couleur basée sur le nom du fil (impair/pair, peut-être?).

Pour sortir la couleur sur la console, vous devrez utiliser une séquence d'échappement ANSI .

Par exemple, pour sortir un texte rouge:

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

Voici quelques exemples:

Juste pour ajouter, vous pourriez peut-être également y parvenir en définissant dans le MDC une variable "randColor" avec un code de couleur ANSI aléatoire, par exemple, dans un Filter, et en l'utilisant dans le conversionPattern d'un standard org.Apache.log4j.PatternLayout dans la configuration de l'appendice de la console de votre 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] Que représente "\ u001B [J"?

24
Xavi López

Vous pouvez utiliser MulticolorLayout à partir de jcabi-log . Ajoutez cette dépendance au projet:

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

Et puis configurez-le dans 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

Idem dans 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>

Dans cet exemple, %p sera remplacé par DEBUG, INFO, ERROR, etc., puis peint dans la couleur correspondant au niveau de journalisation. En plus de cela, vous pouvez utiliser vos propres couleurs ou des couleurs prédéfinies, par exemple:

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

Plus de documentation sur couleurs ANSI .

42
yegor256