2011-12-07 12 views
22

Tengo un receptor sinks::text_file_backend. Decir que ya tengo unos archivos de registro rotados:Boost.Log - cómo configurar un backend de sumidero de texto para anexar archivos girados

myLog001.log, myLog002.log y así sucesivamente

Quiero que el fregadero para seguir escribiendo hasta el último archivo girado - myLog002.log, anexe a su contenido y continuar la rotación desde allí en adelante.

Solo he logrado encontrar keywords::open_mode = append, pero esto solo se agrega a los archivos myLogX existentes, haciéndolos más grandes y, por supuesto, muy difíciles de leer.

¿Se puede hacer esto en Boost.Log?

Respuesta

14

que la funcionalidad está integrada en el fregadero de texto y the documentation incluye un ejemplo para establecer el patrón y las reglas de nombre de archivo para la rotación en ciertos tamaños y tiempos:

// The function registers file sink in the logging library 
void init_logging() 
{ 
    boost::shared_ptr<logging::core> core = logging::core::get(); 

    boost::shared_ptr<sinks::text_file_backend> backend = 
     boost::make_shared<sinks::text_file_backend>(
      // file name pattern 
      keywords::file_name = "file_%5N.log", 
      // rotate the file upon reaching 5 MiB size... 
      keywords::rotation_size = 5 * 1024 * 1024, 
      // ...or at noon, whichever comes first 
      keywords::time_based_rotation = sinks::file::rotation_at_time_point(12, 0, 0) 
     ); 

    // Wrap it into the frontend and register in the core. 
    // The backend requires synchronization in the frontend. 
    typedef sinks::synchronous_sink<sinks::text_file_backend> sink_t; 
    boost::shared_ptr<sink_t> sink(new sink_t(backend)); 

    core->add_sink(sink); 
} 

Aparentemente no hay manera de hacer la biblioteca se agrega a los archivos existentes con esta configuración. Debería llamar al backend->scan_for_files(); antes de construir sink, como se muestra en el encabezado "Administración de archivos girados" en la documentación, pero eso solo evita que la biblioteca sobrescriba los registros anteriores antes de la fecha de limpieza.

Cuando este tema surgió en una lista de correo de desarrollo en febrero de 2013, el autor de la biblioteca explicó que adding support for appending would be a nontrivial change no se podía hacer con el diseño actual.

+0

utilizo backend-> scan_for_files(); en mi programa, pero el programa se bloqueó cuando se ejecuta en este código. Alguna idea sobre esto? –

+0

La rotación funciona, pero ¿qué hay de agregar? Un programa debe anexarse ​​al último registro, para cada ejecución posterior del programa, hasta que el archivo log alcance los límites de rotación. Este código crea un nuevo archivo de registro en cada ejecución y agregar 'scan_for_files' no tiene ningún efecto. – ixe013

+0

Tienes razón, @ Ixe013. He revisado mi respuesta. –

1

Debe especificar el modo_abierto antes de usar el archivo de texto. De forma predeterminada, Boost.Log usará std :: ios_base :: trunc | std :: ios_base :: out como el modo abierto que obviamente truncará el archivo de registro anterior.

Puede crear text_file_backend ejemplo, con los siguientes parámetros:

{ 
     boost::shared_ptr<sinks::text_file_backend> backend = 
      boost::make_shared<sinks::text_file_backend>(
       keywords::file_name = logger_file_path, 
       keywords::open_mode = std::ios_base::app|std::ios_base::out, 
       keywords::rotation_size = 5 * 1024 * 1024, 
       keywords::time_based_rotation = sinks::file::rotation_at_time_point(12, 0, 0)); 
     // Wrap it into the frontend and register in the core. 
     // The backend requires synchronization in the frontend. 
     typedef sinks::synchronous_sink<sinks::text_file_backend> sink_t; 
     boost::shared_ptr<sink_t> sink(new sink_t(backend)); 
     sink->set_formatter(logFmt); 
     core->add_sink(sink); 
    } 
Cuestiones relacionadas