Search code examples
javaconsolelog4j

Making a log4j console appender use different colors for different threads


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.


Solution

  • 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:

    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?