2011-12-13 19 views
52

Quiero agregar el registro a una aplicación que estoy desarrollando, utilizando 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:Error de registro en stderr y depuración, información en stdout con log4j

... 
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, ¿qué debería presentar mi log4j.properties? Aquí cómo se ve en este 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 

El problema con la configuración anterior es que el logger.error() ... se imprime en la salida estándar también.

Respuesta

9

post anterior de por Jon Skeet en Post

unfortunately there is no maximum threshold, so wherever you get debug messages, you also get warning messages. That's a bit of a pain, IMO.

+0

Gracias por su rápida respuesta. ¿Hay alguna forma de subclase del appender (por ejemplo, stdout appender) para que cuando se rechace un registro por encima de INFO? ¿Qué pasa con los filtros: configurar un filtro para stdout para aceptar solo registros de TRACE, DEBUG, INFO? – Elvis

+0

Absolutamente. Puede crear su propio appender y señalarlo en el archivo de configuración. –

+1

Aquí hay un ejemplo de (en xml config) http://stackoverflow.com/questions/4825072/how-to-set-filter-in-the-log4j-xml así que esto es lo mismo que: log4j.appender.stdout. Filter = org.apache.varia.LevelRangeFilter log4j.appender.stdout.Filter.LevelMax = INFO log4j.appender.stdout.Filter.LevelMin = TRACE? Si es así, parece que no funciona en mi caso. Log4j lanza un mensaje de advertencia que indica que el filtro no se puede configurar ... – Elvis

45

Resuelto a continuación también en las propiedades de archivo de formato. El truco fue obtener la definición de filtro correcta. Log4j properties info here

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 
+0

¿Está seguro de que el filtro se puede aplicar al primer apilador de esa manera? No estoy teniendo suerte usando a.archivo de propiedades –

+0

Esta solución funciona para mí, tal vez esto debería marcarse como la solución en lugar de la respuesta proporcionada por John B – Stefan

5
  1. en lugar de utilizar la configuración .properties se debe utilizar una configuración .xml.
  2. En la configuración .xml ponga un elemento llamado "filtro" del tipo "org.apache.log4j.varia.LevelRangeFilter" y configure 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 vistazo a: http://www.laliluna.de/articles/posts/log4j-tutorial.html

1

otro ejemplo mediante el marcado de ThresholdFilter 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.

0

Ésta es config logback que hace exactamente lo que pide (!):

<?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> 
+0

No, lo siento, que también filtra los mensajes de seguimiento y depuración – Thirdman

Cuestiones relacionadas