es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  , , ,

Answer

  1. Avatar for 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 y boost::log::sinks::text_file_backend::rotation_size para configurar la estrategia de rotación. Por ejemplo:

    boost::log::add_file_log(
        boost::log::keywords::file_name = "logs/%Y-%m-%d_%H-%M-%S_%N.log",
        boost::log::keywords::rotation_size = 10 * 1024 * 1024, //rotar después de 10 MB
        boost::log::keywords::time_based_rotation =
            boost::log::sinks::file::rotation_at_time_point{boost::posix_time::hours{24}}, // rotar diariamente
    );
    

    Esto creará archivos de registro en un directorio logs con nombres de archivo en formato YYYY-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.

Comments are closed.