4

How can I set up log4j to use two separate patterns based on the logging level of the message?

For example, right now I'm using the following which applies to all levels:

log4j.appender.stdout.layout.ConversionPattern=%-5p %d{HH\:mm\:ss} - %m%n

What I'd like to do is use a different pattern for levels of WARN and above. Such as:

%-5p %d{HH\:mm\:ss} - [%L:%C] %m%n

To output the line number and class where the warning or error occurred. The extra cost of pulling the caller information would be worth it in situations where a warning or error occurs.

Is this doable?

Here is my full log4j.properties file:

log4j.rootLogger=WARN, stdout1, stdout2
log4j.category.my.package=DEBUG

log4j.appender.stdout1=org.apache.log4j.ConsoleAppender
log4j.appender.stdout1.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout1.layout.ConversionPattern=%-5p %d{HH\:mm\:ss} - %m%n

log4j.appender.stdout2=org.apache.log4j.ConsoleAppender
log4j.appender.stdout2.threshold=WARN
log4j.appender.stdout2.target=System.err
log4j.appender.stdout2.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout2.layout.ConversionPattern=%-5p %d{HH\:mm\:ss} - [%t] [%L:%C] %m%n

EDIT

threshold looks to be what I need to log all levels of WARN and higher. Is there a similar property that will configure the other appender to log all levels of INFO and lower?

John Strickler
  • 25,151
  • 4
  • 52
  • 68

2 Answers2

1

Here the properties I use :

log4j.rootLogger=WARN, CONSOLE, FICLOG

####### CONSOLE is set to be a ConsoleAppender.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
####### CONSOLE uses PatternLayout.
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%-5r %-5p[%C{1}.%M]:%m%n

####### FICLOG is set to be a FileAppender à la racine du projet
log4j.appender.FICLOG=org.apache.log4j.RollingFileAppender
####### FIC uses PatternLayout.
####### ex:log4j.appender.dest2.File=${java.home}/log4j.log
log4j.appender.FICLOG.File=Appli_Info.log
log4j.appender.FICLOG.threshold=WARN
log4j.appender.FICLOG.MaxFileSize=5MB
log4j.appender.FICLOG.MaxBackupIndex=8
log4j.appender.FICLOG.layout=org.apache.log4j.PatternLayout
log4j.appender.FICLOG.layout.ConversionPattern=%d %-8r [%t] %-5p [%C{1}.%M] %x - %m%n
####### log4j.appender.FICLOG.layout.ConversionPattern=%d{HH:mm:ss} %-8r [%t] %-5p [%C{1}.%M] %x - %m%n

HTH

mmdemirbas
  • 9,060
  • 5
  • 45
  • 53
cl-r
  • 1,264
  • 1
  • 12
  • 26
  • `threshold` looks to be what I need to get a second ConsoleAppender to write caller information out. Is there a property similar to threshold which limits the 1st append to outputing levels TRACE to INFO only? – John Strickler Jul 12 '12 at 13:11
  • It seems that you need is to had in your properties : `log4j.appender.stdout1.threshold=INFO, or DEBUG` – cl-r Jul 12 '12 at 13:31
1

Found the answer here: Logging error to stderr and debug, info to stdout with log4j

I ended up having to use an xml file instead of a properties file to get the results that I want.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration>
    <!-- STDERR - WARN and above -->
    <appender name="stderr" class="org.apache.log4j.ConsoleAppender">
        <param name="threshold" value="warn" />
        <param name="target" value="System.err"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%-5p %d{HH\:mm\:ss} - [%t][%L:%C] %m%n" />
        </layout>
    </appender>
    <!-- STDINFO - DEBUG & INFO -->
    <appender name="stdout" class="org.apache.log4j.ConsoleAppender">
        <param name="threshold" value="debug" />
        <param name="target" value="System.out"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%-5p %d{HH\:mm\:ss} - %m%n" />
        </layout>
        <filter class="org.apache.log4j.varia.LevelRangeFilter">
            <param name="LevelMin" value="debug" />
            <param name="LevelMax" value="info" />
        </filter>
    </appender>
    <category name="my.project.package">
        <!-- Display DEBUG and above for all log messages in My Project -->
        <param name="level" value="debug" />
    </category>
    <root>
        <!-- Global Setting - Display only WARN messages
             This surpresses other libraries from display DEBUG & INFO messages
             But the Category setting above for your project will override this 
             and display DEBUG & INFO messages (using STDOUT) as well as 
             WARN and above (using STDERR) -->
        <priority value="warn"></priority>
        <appender-ref ref="stderr" />
        <appender-ref ref="stdout" />
    </root>
</log4j:configuration>
Community
  • 1
  • 1
John Strickler
  • 25,151
  • 4
  • 52
  • 68