Registration error in stderr and debug, information for stdout with log4j

I want to add a log to the application that I am developing using apache log4j. At this point, I want to redirect all log messages to the INFO level and lower (TRACE, DEBUG) to stdout and all other log messages of WARN and higher (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 the log4j.properties file? Here's what it looks like at this point:

 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 logger.error () ... is also printed on standard output.

+52
java logging log4j
Dec 13 '11 at 12:50
source share
4 answers

Per Jon Skeet previous post in Post

Unfortunately, there is no maximum threshold, so wherever you are in debugging messages, you also get warning messages. This is a bit of a pain, imo.

+9
Dec 13 '11 at 13:05
source share

Also resolved in the properties file format. The trick was to correctly identify the filter. Log4j property properties here

Original attempt modified to filter WARN and ERROR:

 log4j.rootLogger=TRACE, 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 = TRACE 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 log4j.appender.stdout.filter.filter1=org.apache.log4j.varia.LevelRangeFilter log4j.appender.stdout.filter.filter1.levelMin=TRACE log4j.appender.stdout.filter.filter1.levelMax=INFO # 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 
+42
Apr 25 '12 at 11:45
source share
  • instead of using the .properties configuration, you should use the .xml configuration.
  • In the .xml config, place an element named "filter" of type "org.apache.log4j.varia.LevelRangeFilter" and set its parameters LevelMax and LevelMin .

For example, the following .xml configuration defines two applications: stdout, stderr. Stdout prints all logs that are less than or equal to INFO for stdout, and stderr prints all logs with a level higher than INFO to stderr.

 <?xml version="1.0" encoding="UTF-8"?> <!-- Document : log4j.xml Created on : 13 ฮ”ฮตฮบฮญฮผฮฒฯฮนฮฟฯ‚ 2011, 3:55 ฮผฮผ Author : elitex Description : Purpose of the document follows. --> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd" > <log4j:configuration> <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 [%t][%F:%L] : %m%n" /> </layout> </appender> <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 [%t][%F:%L] : %m%n" /> </layout> <filter class="org.apache.log4j.varia.LevelRangeFilter"> <param name="LevelMin" value="debug" /> <param name="LevelMax" value="info" /> </filter> </appender> <root> <priority value="debug"></priority> <appender-ref ref="stderr" /> <appender-ref ref="stdout" /> </root> </log4j:configuration> 

For more information, see: http://www.laliluna.de/articles/posts/log4j-tutorial.html

+5
May 08 '14 at 16:34
source share

another example using the ThresholdFilter markup from log4j2.

 <Console name="ConsoleERR" target="SYSTEM_ERR"> <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level - %msg%n"/> <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/> </Console> 

See doc .

+1
Nov 07 '16 at 15:45
source share



All Articles