example debug custom configurar java logging log4j

java - debug - Error de registro en stderr y depuración, información en stdout con log4j



log4j levels order (5)

  1. en lugar de usar la configuración .properties, debe usar una configuración .xml.
  2. En .xml config pone un elemento llamado "filtro" de tipo "org.apache.log4j.varia.LevelRangeFilter" y establece sus parámetros LevelMax y LevelMin .

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 .