El contexto: estamos trabajando en una aplicación multiproceso (Linux-C) que sigue un modelo de canalización.
Cada módulo tiene un hilo privado y objetos encapsulados que procesan datos; y cada etapa tiene una forma estándar de intercambio de datos con la siguiente unidad.
La aplicación está libre de pérdidas de memoria y es segura para subprocesos utilizando bloqueos en el punto donde intercambian datos. El número total de hilos es de aproximadamente 15, y cada hilo puede tener de 1 a 4 objetos. Hacer alrededor de 25-30 objetos impares, todos los cuales tienen algunos registros críticos que hacer.
La mayoría de las discusiones que he visto sobre diferentes niveles, como en Log4J, y sus otras traducciones. La verdadera gran pregunta es sobre cómo debería suceder realmente el registro general.
Un enfoque es todo lo fprintf
que hace el registro local stderr
. El stderr se redirige a algún archivo. Este enfoque es muy malo cuando los registros se vuelven demasiado grandes.
Si todos los objetos crean instancias de sus registradores individuales (aproximadamente 30-40 de ellos) habrá demasiados archivos. Y a diferencia de lo anterior, uno no tendrá la idea del verdadero orden de los eventos. La marca de tiempo es una posibilidad, pero aún es un desastre clasificar.
Si hay un único patrón de registrador global (singleton), indirectamente bloquea tantos hilos mientras uno está ocupado colocando registros. Esto es inaceptable cuando el procesamiento de los hilos es pesado.
Entonces, ¿cuál debería ser la forma ideal de estructurar los objetos de registro? ¿Cuáles son algunas de las mejores prácticas en aplicaciones reales a gran escala?
¡También me encantaría aprender de algunos de los diseños reales de aplicaciones a gran escala para obtener inspiración!
======
EDITAR:
Basado en ambas respuestas, aquí está la pregunta que ahora me queda:
¿Cuál es la mejor práctica sobre la asignación de registradores (colas de registro) al objeto: si deben llamar a global_api () o si el registrador se les debe asignar en el constructor. Cuando los objetos están en una jerarquía profunda, este enfoque posterior se vuelve tedioso. Si están llamando a global_api (), es una especie de acoplamiento con la aplicación, por lo que intentar usar este objeto en otra aplicación arroja esta dependencia. ¿Hay una forma más limpia para esto?