2011-01-18 34 views
11

Hola normalmente en niveles de prioridad son los siguientes Log4jcambiar el nivel de prioridad en Log4J

  • DEBUG < INFO < WARN < ERROR FATAL <

podemos cambiar esto niveles de prioridad. Mi requisito es que necesito registrar solo los detalles que tienen el nivel de prioridad INFO y FATAL. Los registros con nivel de prioridad DEBUG, WARN y ERROR no deberían registrarse. Si puedo cambiar los niveles de prioridad como

  • DEBUG < WARN < ERROR FATAL < INFO <

es posible. O hay otra forma de hacerlo? Pls ayuda ..

+0

¿Por qué no utilizar WARN y fatal o ADVERTENCIA y ERROR? Eso es típicamente lo que hacen la mayoría de los proyectos que he visto, y no tiene que cambiar la forma en que funciona log4j y potencialmente confundir a las personas nuevas que se unen al proyecto. – jmort253

+0

No. Estoy registrando todos los niveles de mensajes. Pero en las ejecuciones normales solo necesito registrar INFO y FATAL. Habrá ocasiones en que necesito depurar la aplicación. En ese momento voy a registrar los 5 mensajes de nivel. Espero hacerlo cambiando el archivo de configuración externo (no el utilizado para log4j) que cambia el nivel de prioridad del registrador que estoy usando. – nath

+0

¿Tarea en cualquier lugar? – gabuzo

Respuesta

26

Nunca fui necesario para hacer esto, pero desde que una vez leí Log4J - El manual completo, espero que estos indicadores ayuden.

  1. Escribe tu propia filtro personalizado mediante la extensión de org.apache.log4j.spi.Filter
  2. Anulación decide method
  3. Uso loggingEvent.getLevel(), para identificar el nivel de registro que se desencadenó.
  4. Escribir siguiente lógica en decidir

    if(event.getLevel() == Level.INFO || event.getLevel() == Level.FATAL) 
        return ACCEPT; 
    return DENY; 
    

Este filtro aceptará todos los registros que son o INFO o fatal. Puede ser más creativo.

Tenga en cuenta que no he probado este código. Esta es sólo una guía, espero que esta ayuda


Edición: en una búsqueda poco, encontré algo que podría ser más fácil. Supongo, puede utilizar LevelMatchFilter, de esta manera

<filter class="org.apache.log4j.varia.LevelMatchFilter"> 
    <param name="LevelToMatch" value="info" /> 
    <param name="AcceptOnMatch" value="true" /> 
    </filter> 
    <filter class="org.apache.log4j.varia.LevelMatchFilter"> 
    <param name="LevelToMatch" value="fatal" /> 
    <param name="AcceptOnMatch" value="true" /> 
    </filter> 
    <filter class="org.apache.log4j.varia.DenyAllFilter"/> 

se refieren: http://wiki.apache.org/logging-log4j/Log4jXmlFormat para configurarion XML. Hay una sección sobre Filter Configuration


No sé lo que deja de OP en la aceptación de esta respuesta. Acabo de probar, funciona:

Aquí está el XML.

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> 

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> 
    <appender name="util" class="org.apache.log4j.FileAppender"> 
    <param name="File" value="D:/util.log" /> 
    <param name="Append" value="true" /> 
    <layout class="org.apache.log4j.PatternLayout"> 
     <param name="ConversionPattern" value="%t %-5p %c{2} - %m%n"/> 
    </layout>   

    <filter class="org.apache.log4j.varia.LevelMatchFilter"> 
     <param name="LevelToMatch" value="info" /> 
     <param name="AcceptOnMatch" value="true" /> 
    </filter> 
    <filter class="org.apache.log4j.varia.LevelMatchFilter"> 
     <param name="LevelToMatch" value="fatal" /> 
     <param name="AcceptOnMatch" value="true" /> 
    </filter> 
    <filter class="org.apache.log4j.varia.DenyAllFilter"/> 

    </appender> 

    <root> 
    <priority value ="debug" /> 
    <appender-ref ref="util" /> 
    </root> 


</log4j:configuration> 

Aquí está el código de Java

DOMConfigurator.configure("log4j.xml"); 
    Logger log = Logger.getLogger(Test.class); 
    log.debug("DEBUG"); 
    log.info("INFO"); 
    log.warn("WARN"); 
    log.error("ERROR"); 
    log.fatal("FATAL"); 

Aquí está la salida de (según la configuración) D:/util.log

main INFO test.Test - INFO 
main FATAL test.Test - FATAL 
+0

Gracias amigo ... Funciona bien. De nuevo, muchas gracias. :) – nath

+0

@ganuke me alegro de que haya ayudado. – Nishant

0

Afaik, no puede cambiar la prioridad de prioridad en Log4j. Sin embargo, usted puede escribir su propia implementación logger, que registrará información sólo necesitaba:

  • escribir su propia LoggerFactory/Logger par
  • especificar LoggerFactory en log4j.properties archivo:

    log4j.loggerFactory = com.mycompany.mypackage .MyLog4JLoggerFactory

  • En su implementación de Logger, ignore todo excepto los errores INFO y FATAL.

Sin embargo, lo anterior podría no ser la mejor solución, ya que está orientado hacia 1.2.x. Tal vez las versiones más nuevas de log4j (SLF4J) tengan formas más elegantes de lograrlo.

0

Puede lograrlo realizando algunos cambios en el archivo log4j.properties.
Por ejemplo, su nivel predeterminado podría ser FATAL y luego puede especificar su paquete o una clase para el nivel INFO.

log4j.rootLogger = FATAL, stdout, R

Declaración de los registros del paquete:
log4j.logger.com.xxx = INFO

Declaración de los registros de la Clase:
log4j.logger.com. xxx.util.EmailManager = INFO

Espero que ayude.

+0

esto no hará lo que quiera. necesita leer la pregunta completa – fmucar

+0

Entiendo lo que está preguntando y la respuesta que di es la solución más simple para registrar las instrucciones de registro FATAL e INFO. – JSS

Cuestiones relacionadas