2010-10-28 29 views
8

he definido un appender log4j como:Log4J - tienen múltiples appenders escribir en el mismo archivo con uno que siempre registra

log4j.logger.com.example = DEBUG, filelog 

log4j.appender.filelog=org.apache.log4j.DailyRollingFileAppender 
log4j.appender.filelog.File=c:/app.log 
log4j.appender.filelog.layout=org.apache.log4j.PatternLayout 
log4j.appender.filelog.layout.ConversionPattern=%d | %m%n 
log4j.appender.filelog.DatePattern=.dd-MM-yyyy 

En mi clase, me sale el registrador como:

Log logger = LogFactory.getLog(getClass()); 

Esto funciona correctamente Quiero tener un registrador que siempre registra ciertos mensajes (no errores, pero cosas como cuánto tardaron las transacciones). Si escribo esto en DEBUG o INFO, no los veré si se cambia el nivel de registro. Creo que puedo lograr esto usando otro appender que escribe en el mismo archivo.

Es esto posible tener dos appenders escribir en el mismo archivo? ¿Cómo obtendría la instancia del registrador en la que quiero utilizar el apilador de depuración normal y el apéndice transaccional en la misma clase? Estos mensajes no estarán todos en el mismo paquete, por lo que no puedo configurar un determinado paquete para que siempre se registre. Tendré que tienen estos appenders escribir en diferentes archivos, o se les tanto recuperar el código y tener algo como:

Log alwaysLogger = LogFactory.getLog(ALWAYS); 
alwaysLogger.debug("This message will always be written regardless of the level set on the filelog appender"); 

actualización pude escribir en dos archivos de registro diferentes, si es necesario, pero ¿cómo ¿Obtendré la instancia de registrador en mi clase? No quiero configurar un paquete/clase para usar siempre un appender sobre el otro ya que las clases tendrán que registrar mensajes de información/error y los mensajes transaccionales "siempre" durante una ejecución normal. ¿Hay alguna manera de lograr lo que necesito incluso si escribe en dos archivos de registro diferentes?

Respuesta

6

No creo log4j realmente soporta dos appenders al grabar en el mismo archivo debido a problemas de sincronización. Su mejor opción sería, si es posible, para hacer un cambio a slf4j usando Logback como su sistema de registro back-end desde Logback es el sucesor de log4j y también soporta múltiples appenders al grabar en un archivo. Consulte FileAppender y es el modo prudente.

Actualización: según su descripción, lo que debería saber también es markers. Solo necesita una instancia de registrador, y puede obtener un control más detallado usando marcadores, porque con ellos básicamente dice "esta declaración de registro tiene un propósito especial, y debe registrarse usando un apéndice apropiado". También puede consultar el apéndice de registro additivity, que generalmente se usa cuando utiliza dos o más apéndices para una declaración de registro.

+0

Ok, incluso si necesito escribir en un archivo separado, ¿cómo puedo obtener ambas instancias de registrador en mi código? ¿Debo especificar qué paquetes usarán un appender sobre el otro? No quiero que eso suceda, ya que estas clases tendrán que registrar mensajes de información/error, así como las líneas "siempre". –

+2

Esto es correcto. Es posible configurar varios appenders para el mismo archivo que funcionará durante un tiempo, pero la rotación de registros dará como resultado que uno de los apéndices escriba en un archivo anterior y, finalmente, registre la pérdida de los mensajes. – TaninDirect

2

Por lo que yo sé, la creación de instancias de madereros con un identificador de clase de paquete & es sólo una convención. Usted es libre de crear múltiples instancias de registrador en cualquier clase y darles cualquier identificador.

Log alwaysLogger = LogFactory.getLog("a.b.c.ALWAYS"); 
Log sometimesLogger = LogFactory.getLog("a.b.c.SOMETIMES"); 

En cuanto a la escritura en el mismo archivo, no lo han intentado, pero debería ser posible, al menos desde un único hilo. Es posible que deba escribir su propio apéndice en lugar de confiar en uno de los predeterminados.

-1

Sí. Puede "solución alternativa" para tener 2 appenders escribiendo en el mismo archivo.

Pedido esta code + example:

Cualquier pregunta es bienvenida.

0

que tiene esto funcione mediante el uso de AsyncAppender s. Tenía mi appender principal que especificaba un archivo para iniciar sesión, y mis otros apéndices se referían a él.

p. Ej.

<appender name="top" class="org.apache.log4j.rolling.RollingFileAppender"> 
    <param name="file" value="myLog.log" /> 
</appender> 

<appender name="other" class="org.apache.log4j.AsyncAppender"> 
    <appender-ref ref="top" /> 
</appender> 

<logger name="com.example.MyCLass"> 
    <appender-ref ref="other" /> 
</logger> 

Puede agregar otros filtros, o lo que sea, a los otros appenders. Por lo que puedo decir con mi propia aplicación, los registros parecen rodar, y los filtros del appender funcionan como se esperaba.

Cuestiones relacionadas