Quiero tener un registro de diagnóstico producido por varias tareas de administración de datos. Estas tareas pueden estar en múltiples hilos. Cada tarea necesita escribir un elemento (posiblemente con subelementos) en el registro; entrar y salir rápidamente. Si se tratara de una situación de una sola tarea, utilizaría XMLStreamWriter ya que parece ser la mejor opción para la simplicidad/funcionalidad sin tener que mantener un documento XML expandido en la memoria.¿Mejores prácticas para el registro de Java desde varios subprocesos?
Pero no es una situación de una sola tarea, y no estoy seguro de cómo asegurarme de que es "seguro para hilos", donde "enhebrar" en esta aplicación significa que cada elemento de registro debe escribirse correctamente en el registro en serie (uno después del otro y no intercalado de ninguna manera).
¿Alguna sugerencia? Tengo una vaga intuición de que el camino a seguir es usar una cola de elementos de registro (con cada uno de ellos capaz de producirse rápidamente: mi aplicación está ocupada haciendo un trabajo real que es sensible al rendimiento), y tengo un hilo separado que maneja el registro elementos y los envía a un archivo para que el registro no interrumpa a los productores.
El registro no tiene que ser necesariamente XML, pero sí quiero que sea estructurado y legible por máquina.
editar: puse "threadsafe" entre comillas. Log4j parece ser la opción obvia (nueva para mí pero antigua para la comunidad), ¿por qué reinventar la rueda?
Tengo el mismo problema, pero no es necesario que muestre el registro en tiempo real (solo después de que se ejecuten todos los subprocesos). Mi solución es agregar una hora del sistema al inicio de cada mensaje y ordenarlos en el tiempo. – Fuhrmanator
La hora del sistema no es confiable después de todo, algunas operaciones están tan cerca que tienen la misma marca de tiempo en milisegundos. La ordenación puede dar como resultado un cambio de orden. Entonces, otra cosa que intenté fue usar Colllections.synchronizedList() para envolver una ArrayList de cadenas de mensajes. Agregar a la cadena una marca de tiempo muestra que incluso así no es perfecto. Algunos mensajes en mi caso estaban fuera de servicio (en uno o dos milisegundos), pero esto probablemente se deba a la demora de cola para la llamada de add() a la lista sincronizada. – Fuhrmanator