java - debug - Error de registro en stderr y depuración, información en stdout con log4j
log4j levels order (5)
- en lugar de usar la configuración .properties, debe usar una configuración .xml.
- En .xml config pone un elemento llamado "filtro" de tipo "org.apache.log4j.varia.LevelRangeFilter" y establece sus parámetros
LevelMax
yLevelMin
.
Por ejemplo, la siguiente configuración .xml define dos appenders: stdout, stderr. El stdout imprime todos los registros que tienen un nivel inferior o igual que INFO a stdout, y el stderr imprime todos los registros con un nivel mayor que INFO a 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>
Para obtener más información, consulte: http://www.laliluna.de/articles/posts/log4j-tutorial.html
Quiero agregar el registro a una aplicación que estoy desarrollando, usando apache log4j. En este punto, quiero redireccionar todos los mensajes de registro para INFO de nivel y bajar (TRACE, DEPUR) a stdout y todos los demás mensajes de registro de WARN y superior (ERROR, FATAL) a stderr. Por ejemplo:
...
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
Entonces, ¿cuál debería ser mi archivo log4j.properties? Aquí cómo se ve en este momento:
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
El problema con la configuración anterior es que logger.error () ... también se imprime en stdout.
Esta es la configuración de logback que hace exactamente (!) Lo que estás pidiendo:
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true" scan="true" scanPeriod="30 seconds">
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<target>System.out</target>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<encoder>
<pattern>
%-4relative [%thread] %-5level %logger - %msg%n
</pattern>
</encoder>
</appender>
<appender name="STDERR" class="ch.qos.logback.core.ConsoleAppender">
<target>System.err</target>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>WARN</level>
</filter>
<encoder>
<pattern>
%-4relative [%thread] %-5level %logger - %msg%n
</pattern>
</encoder>
</appender>
<root level="${LOGBACK_ROOT_LEVEL:-INFO}">
<appender-ref ref="STDOUT" />
<appender-ref ref="STDERR" />
</root>
</configuration>
La publicación anterior de Per Jon Skeet en Post
desafortunadamente no hay un umbral máximo , de modo que siempre que reciba mensajes de depuración, también recibirá mensajes de advertencia. Eso es un poco doloroso, OMI.
Resuelto abajo también en formato de archivo de propiedades. El truco fue obtener la definición de filtro correcta. Información de propiedades de Log4j aquí
El intento original, modificado para filtrar WARN & 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
otro ejemplo usando el marcado ThresholdFilter
de 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>
Ver el doc .