I want to add logging to an application I am developing, using apache log4j. At this point I want to redirect all log messages for level INFO and lower (TRACE, DEBUG) to stdout and all other log messages from WARN and above (ERROR, FATAL) to stderr. For example:
...
logger.info("Processing at some point"); // must be written to stdout
logger.debug("Point x was processed"); // must be written to stdout
logger.warn("Incorrect point config"); // must be written only to stderr
logger.error("Exception occurred at point x"); // must be written only to stderr
So what should be my log4j.properties file? Here how it looks at this momment:
log4j.rootLogger=DEBUG, stdout, stderr
# configure stdout
# set the conversion pattern of stdout
# Print the date in ISO 8601 format
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Threshold = DEBUG
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = %-5p %d [%t][%F:%L] : %m%n
# configure stderr
# set the conversion pattern of stdout
# Print the date in ISO 8601 format
log4j.appender.stderr = org.apache.log4j.ConsoleAppender
log4j.appender.stderr.Threshold = WARN
log4j.appender.stderr.Target = System.err
log4j.appender.stderr.layout = org.apache.log4j.PatternLayout
log4j.appender.stderr.layout.ConversionPattern = %-5p %d [%t][%F:%L] : %m%n
The problem with the above configuration is that the logger.error() ... is printed at stdout too.
Solved below also in properties file format. The trick was to get the filter definition right. Log4j properties info here
The original attempt, modified to filter WARN & ERROR:
Per Jon Skeet's previous post at Post
LevelMax
andLevelMin
.For example the following .xml configuration define two appenders: stdout, stderr. The stdout prints all logs that have a level less than or equal to INFO to stdout, and the stderr prints all logs with level greater than INFO to stderr.
For more info look at: http://www.laliluna.de/articles/posts/log4j-tutorial.html
This is logback config which does exactly(!) what you asking for:
Changing it to NEUTRAL and adding filter for DEBUG should let it capture DEBUG as well. There is another built-in filter which requires janino dependency:
another example using the
ThresholdFilter
markup from log4j2.See the doc.