boost::log con multiproceso
He realizado una pregunta sobre cómo utilizar boost::log en múltiples procesos en https://stackoverflow.com/questions/70111914/how-to-use-boostlog-not-to-rewrite-the-log-file/70114545#70114545.
Esa respuesta puede solucionar la mayoría del problema. Pero en algunos casos raros, cuando un proceso está escribiendo registro y otro proceso comienza a escribir registro,
13548:Tue Nov 30 17:33:41 2021
12592:Tue Nov 30 17:33:41 2021
13548:Tue Nov 30 17:33:41 2021
12592:Tue Nov 30 17:33:4572:Tue Nov 30 17:33:41 2021
17196:Tue Nov 30 17:33:41 2021
8572:Tue Nov 30 17:33:41 2021
17196:Tue Nov 30 17:33:41 2021
8572:Tue Nov 30 17:33:41 2021
La cuarta línea 17:33:4(1 2021)
se borró con (8)572:Tue Nov
, que fue escrito por el otro proceso.
¿Cómo puedo evitar esto?
davy.ai
Para prevenir que los registros se sobrescriban en escenarios multiproceso utilizando boost::log, una solución es usar un sink de archivo rotativo. Esto asegurará que los registros de diferentes procesos se escriban en archivos separados y que cada archivo se rotará después de un tiempo determinado o cuando alcance cierto tamaño.
Para utilizar un sink de archivo rotativo con boost::log, se pueden usar las opciones
boost::log::sinks::text_file_backend::rotation_at_time_point
yboost::log::sinks::text_file_backend::rotation_size
para configurar la estrategia de rotación. Por ejemplo:Esto creará archivos de registro en un directorio
logs
con nombres de archivo en formatoYYYY-MM-DD_HH-MM-SS_<n>.log
, donde<n>
es un identificador único. El tamaño de rotación está configurado en 10 MB y los registros se rotarán diariamente. Cada proceso escribirá en un archivo de registro separado y no habrá riesgo de que los registros se sobrescriban.Además, es posible que desee considerar el uso de un mutex u otro mecanismo de sincronización para asegurarse de que solo un proceso escriba en el archivo de registro en cualquier momento dado.