2010-05-04 7 views
7

Solo hay un archivo. Y está escrito simultáneamente mientras se ejecutan las copias de la aplicación web.¿Cómo diferencia las sesiones de log4j en un archivo de registro de las copias de la misma aplicación web?

¿Cómo se filtran solo los mensajes de sesión de registro de otras líneas de registro?

+0

¿con qué contenedor? – skaffman

+0

No estoy seguro de entender su pregunta. ¿Desea un archivo (registro) por sesión web? – bert

+0

@skaffman Tomcat 6. @bert Todo está escrito en un solo archivo, de todas las sesiones. Quiero escuchar desde diferentes enfoques cómo lidiar con eso. – EugeneP

Respuesta

12

El uso de un filtro de servlet con información NDC o MDC es la mejor forma que he visto. Una comparación rápida de los dos está disponible en http://wiki.apache.org/logging-log4j/NDCvsMDC.

He encontrado que MDC me ha funcionado mejor en el pasado. Recuerde que deberá actualizar su archivo de propiedades de log4j para incluir la versión que prefiera (definiciones de patrones en http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PatternLayout.html).

Un ejemplo completo de la configuración de MDC con un filtro de servlet está disponible en http://veerasundar.com/blog/2009/11/log4j-mdc-mapped-diagnostic-context-example-code/.

Una opción ligeramente más fácil de configurar, pero significativamente inferior: puede optar por simplemente imprimir el ID del hilo (a través del archivo de propiedades) para cada solicitud y asegurarse de que lo primero que registra sobre cada solicitud es un identificador de sesión . No es tan apropiado (o útil), pero puede funcionar para aplicaciones de bajo volumen.

5

También podemos establecer un mensaje de contexto que incluye el identificador de la instancia de aplicación específica utilizando org.apache.log4j.NDC, así:

String appInstanceId = "My App Instance 1"; 
org.apache.log4j.NDC.push(appInstanceId); 
// handle request 
org.apache.log4j.NDC.clear(); 

Puede configurar el contexto durante la inicialización de la instancia de aplicación web, o dentro de la doPost() método de sus servlets. Como su nombre lo indica, también puede anidar contextos dentro de contextos con múltiples llamadas push en diferentes niveles.

Consulte la sección "Contextos de diagnóstico anidados" en el Log4J manual.

2

Aquí hay una página que configura un filtro para MDC web-app ->http://rtner.de/software/MDCUserServletFilter.html

ser un filtro de servlet que le liberará de la gestión de MDC/NDC en cada una de sus servlets.

Por supuesto, debe modificarlo para guardar información más pertinente para su aplicación web.

1

Si desea diferenciar las sesiones en la misma aplicación, entonces el MDC es el camino a seguir. Pero si desea diferenciar las aplicaciones web que escriben en el mismo archivo, entonces MDC no lo ayudará porque funciona en un subproceso. En tal caso, solía hacer mi propio appender que sabe a qué instancia de aplicación sirve. Esto puede hacerse a través de las propiedades de configuración del apéndice. Tal apilador colocará el nombre de la aplicación en cada evento de registro como una propiedad antes de escribirlo en el medio, y luego puede usar un diseño para mostrar este valor de propiedad en el archivo de texto en el que escribe. Usar MDC en tal caso no funcionará porque cada hilo tendrá que MDC.put (applicationName) y eso es bastante feo. MDC solo es bueno para un solo proceso, no para varios procesos. Si alguien sabe de otra manera, me gustaría escuchar.

Cuestiones relacionadas