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

je suis à la recherche de quelques 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 sur OS X. Cela pourrait-il être fait en utilisant un modèle de conversion pour produire 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.

32
demandé sur Donal Fellows 2011-10-21 14:45:42

2 réponses

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

pour afficher la couleur sur la console, vous devez utiliser une ANSI Escape Sequence .

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, peut - être que vous pourriez également y parvenir en mettant dans le MDC une variable "randColor" avec un code 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 Console appender de 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"?

23
répondu Xavi López 2017-12-07 13:06:36

vous pouvez utiliser MulticolorLayout de jcabi-log . Ajouter cette dépendance au projet:

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

et le configurer ensuite en 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

Même 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. et puis peintes dans la couleur qui est pertinent pour le niveau de journalisation. En outre, vous pourrez utiliser vos propres couleurs ou de 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 ANSI colors .

38
répondu yegor256 2017-01-14 11:43:02