Pregunta

Tengo una aplicación en capas en Java que tiene un multi hilo capa de acceso a datos, que se invoca desde diferentes puntos.Una sola llamada a esta capa es probable que generar varios hilos para paralelizar las peticiones a la base de datos.

Lo que estoy buscando es una herramienta de registro que me permita definir las "actividades" que está compuesto por varios hilos.Por lo tanto, el mismo método en la capa de acceso a datos debe de registro de salidas diferentes en función de su llamada.La capacidad para agrupar los diferentes salidas para resumir el costo total de una operación es también importante.

Aunque la aplicación está en Java, el lenguaje no es una restricción;lo que necesito son las directrices de diseño de modo que la eventual implementación de la misma.Actualmente estamos utilizando log4j, pero no puede obtener este comportamiento de ella.

¿Fue útil?

Solución

Usted también debe tener una mirada en el anidado de diagnóstico de contexto característica de log4j.Empujando contextos diferentes para el registrador de diferentes las personas que llaman pueden hacer el truco para ti.

Otros consejos

Usted debe ser capaz de pasar un registrador de alrededor, por lo que se crea un registro basado en algunos de los "comunes" para la tarea de los datos - es decir,nombre de usuario, etc.A continuación, pasa este registrador como parámetro para todos los métodos que usted necesita.De esa manera, usted será capaz de establecer diferentes filtros y/o reglas en el archivo de configuración de log4j.O raspar el archivo de salida basado en el registrador de nombre.

EDITAR:Compruebe también MDC y NDC clases en log4j.Se puede añadir que los datos de contexto.

En log4j puede registrar el nombre del hilo con el "%t" del patrón.Ver log4j Patrón de Diseño.

En uno de mis (web) de las aplicaciones, yo uso un ThreadLocal registrador que captura la información de registro en un StringBuilder.El registrador de objeto se inicializa en el HttpServlet#método de servicio, si una traza parámetro se establece (si no es así, hay una muy rápida null-logger).La salida resultante se deposita como un comentario HTML en el que solicita la página, o por escrito a un archivo de registro en un segmento.

En Java5 (y posterior) puede llamar a

StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();

Inspeccionar el seguimiento de la pila a cualquier profundidad que desea y el registro según corresponda.

En Java 1.4 se puede obtener la misma información con

StackTraceElement[] stackTrace = new Exception().getStackTrace();

Desea asociar registrador de objetos con los hilos, creo.Un ThreadLocal variable que contiene un log4j registrador de instancia para cada hilo puede ayudar:

http://java.sun.com/javase/6/docs/api/java/lang/ThreadLocal.html

Usted tendrá que pasar un poco de estructura a la capa de acceso a datos que identifica el actual "actividad".Usted puede tener una "Actividad"de la clase que tiene sentido, se podría utilizar un Registrador de instancia como Sunny sugerido o usted podría utilizar una tercera estructura para mantener un seguimiento de la actividad de contexto.

En cualquier caso, desde su "actividad" se procesan a través de múltiples hilos no se puede utilizar hilo de los locales de almacenamiento para mantener un seguimiento de la corriente de la "actividad", como la mayoría de los otros las respuestas actuales sugieren.Usted tendrá que pasar alrededor de forma explícita.

Me gustaría sugerir hacer una pequeña fachada en la parte superior de log4j que amplía la interfaz con los métodos como

void debug(Activity activity, String message);

y pasando a la actividad-en este contexto de la capa de acceso a datos.

Usted tendrá que hacer algunas modificaciones a la capa de acceso a datos para permitir pasar a la actividad actual, pero la mejor manera de hacerlo que depende fuertemente de la interfaz actual.Si utiliza el espacio de trabajo-patrón, es posible que sólo necesita agregar un setActivity() método en el espacio de trabajo de clase, pero otra interfaz-patrón puede ser necesario añadir un parámetro de Actividad para todos los métodos.

Si por alguna razón no puede o no quiere cambiar la capa de acceso a datos, usted podría, por supuesto almacén de la actividad-contexto en el hilo de los locales de almacenamiento antes de invocar la capa de acceso a datos y recuperar justo antes de que el desove de los subprocesos o enqueing los puestos de trabajo en la capa de acceso a datos.Que es una solución viable, pero es un poco peligroso pasar la información de esa manera.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top