2009-02-25 22 views
5

Mi log4j.xml contiene:¿Por qué están desfasadas mis marcas de tiempo del archivo de registro de Log4j y cómo lo soluciono?

<appender class="org.jboss.logging.appender.RollingFileAppender" name="rm"> 
    ... 
    </layout> 

Mi archivo de registro muestra las marcas de tiempo que están fuera de orden. ¿Podemos mostrar en base a la marca de tiempo?

 
2009-02-19 14:47:01,288 DEBUG [com.catalystwms.core.persistence.TransactionContext] 
2009-02-19 14:54:27,429 INFO [com.catalystwms.tms.services.background.purge.PurgeManager] 
2009-02-19 14:47:01,288 DEBUG [com.catalystwms.core.services.ServiceLocator]

Por favor, ayúdame.

Gracias,

+0

¿Está recopilando registros de varios servidores en un apilador log4j? ¿Estás utilizando algún apéndice asincrónico? Necesitamos ver más de su log4j.xml para saber qué está pasando. – Eddie

+0

Sí.múltiples subprocesos se ejecutan dentro de un servidor y estoy utilizando RollingFileAppender solo no es asyncappender.Gracias –

Respuesta

3

son las dos declaraciones de registro que ocurren en diferentes hilos.

(Tema 1) 2009-02-19 14: 54: 27 429 INFO [com.catalystwms.tms.services.background.purge.PurgeManager]
(Tema 2) 2009-02-19 14 : 47: 01,288 DEPURACIÓN [com.catalystwms.core.services.ServiceLocator

Creo que el tiempo de las declaraciones de registro indica de manera exacta la hora en que ocurrió el evento pero que acaba de escribirse fuera de orden porque el hilo 2 está esperando para obtener el bloqueo. Creo que envolver su appender en un org.apache.log4j.AsyncAppender debería solucionar el problema.

+0

Sí.múltiples subprocesos se están ejecutando.¿Necesito usar AsyncAppender instalado de RollingFileAppender? –

+0

Puede mantener el RollingFileAppender simplemente envolviendo un AsyncAppender a su alrededor. no sé cómo hacerlo en la configuración pero en el código AsyncAppender tiene un método: public void addAppender (org.apache.log4j.Appender newAppender) – richs

2

El formato de fecha está diseñado para permitir que una clasificación basada en caracteres simples lo ordene correctamente.

sort server.log | more 

EDITAR: Esto es útil para usar en archivos de registro existentes (no para configurar log4j).

+0

¿Cómo puedo usar eso en log4j.xml? aclare –

+0

Usted no lo use en log4j, luego lo usa en el registro (cuando lo está leyendo, quizás). –

+0

No tengo idea de dónde debería ir esa entrada? Mi registro está construido dinámicamente. –

-1

Probablemente no podrá solucionarlo antes de que se escriba el registro. Podría intentar modificar log4J para llamar a .flush() después de cada escritura, pero eso hará que su código sea mucho más lento y la solución de @Chris Nava sea más apropiada.

1

Tiene dos procesos diferentes que inician sesión en el mismo archivo de registro con un apilador rodante. Log4j no permite esto. En el pasado, resolví esto en una aplicación web en clúster agregando un nombre de servidor al archivo de registro: appname-server1.log y appname-server2.log con cada servidor configurado para escribir en su propio registro.

Esto también puede ser útil para rastrear errores que son específicos de la configuración de una máquina frente a otra.

Todo lo anterior también funciona si tiene dos aplicaciones diferentes escribiendo en el mismo archivo de registro nombrando los archivos según la aplicación que se está ejecutando.

0

En respuesta a @andy:
(Tema 1) 2009-02-19 14: 54: 27 429 INFO [com.catalystwms.tms.services.background.purge.PurgeManager]
(Tema 2) 2009-02-19 14: 47: 01,288 DEBUG [com.catalystwms.core.services.ServiceLocator

lo que creo que puede estar ocurriendo es rosca 2 crea una LogRecord a las 14: 47: 01.288 cuando intenta escribe, necesita obtener un candado para la lista de apéndices del registrador, pero otro hilo tiene el candado y está ocupado haciendo IO así que el hilo 2 espera. thread 1 crea logRecord a las 14: 54: 27,429 intenta obtener el mismo bloqueo y también espera. Cuando se libera el bloqueo, el sistema operativo lo transfiere al hilo 1 y lo imprime.

Si esto es cierto, el otro gran problema es el rendimiento. Las rutas de código podrían bloquearse al iniciar sesión IO.

Cuestiones relacionadas