I am tracking down some concurrency issues and it would be very helpful to have the output lines from each thread in a different color when logging to a console. I am on OS X. Could this be done using a conversion pattern to output some control codes or would it need a custom appender? Anyone know how?
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 ...
The lines for exec-9 and exec-10 should be in different colors.
The default target is System. err . Console appender uses the log message pattern specified by the user in configuration using PatternLayout property.
In the log4j2 architecture, an appender is basically responsible for sending log messages to a certain output destination. Here are some of the most useful types of appenders that the library provides: ConsoleAppender – logs messages to the System console. FileAppender – writes log messages to a file.
You can use MulticolorLayout
from jcabi-log. Add this dependency to the project:
<dependency> <groupId>com.jcabi</groupId> <artifactId>jcabi-log</artifactId> <version>0.17.1</version> </dependency>
And then configure it in 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
Same in 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>
In this example, %p
will be replaced by DEBUG
, INFO
, ERROR
, etc. and then painted into the color that is relevant to the logging level. Besides that you are able to use your own colors or predefined colors, for example:
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
More documentation about ANSI colors.
You can extend PatternLayout
and override format(ILoggingEvent)
. There you could look at LoggingEvent.getThreadName()
to get some color based on the thread name (odd/even, maybe?).
In order to output color to the console, you'll need to use an ANSI Escape Sequence.
For instance, to output a red text:
"\u001b[" // Prefix - see [1] + "0" // Brightness + ";" // Separator + "31" // Red foreground + "m" // Suffix + text // the text to output + "\u001b[m " // Prefix + Suffix to reset color
Here some examples:
ColoredPatternLayout
implementation by Ingo Thon.Just to add, maybe you could also achieve this by setting in the MDC a variable "randColor" with a random ANSI color code, for instance, in a Filter
, and using it in the conversionPattern
of a standard org.apache.log4j.PatternLayout
in your log4j's console appender configuration:
<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?
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With