c++ - Boost.Log: cómo configurar un backend de sumidero de texto para anexar archivos girados
logging boost-log (2)
Tengo un sinks::text_file_backend
sink. Supongamos que ya tengo algunos archivos de registro rotados:
myLog001.log, myLog002.log y así sucesivamente
Quiero que el receptor siga escribiendo en el último archivo girado - myLog002.log, anexar a su contenido y continuar la rotación desde allí.
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?
Debe especificar open_mode 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 una instancia de text_file_backend 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);
}
Esa funcionalidad está integrada en el receptor de texto, y la documentación incluye un ejemplo para establecer el patrón de nombre de archivo y las reglas para rotar en determinados tamaños y horas:
// 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 forma de hacer que la biblioteca se anexe a los archivos existentes con esta configuración. Debería llamar a backend->scan_for_files();
antes de construir el 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 agregar soporte para agregar sería un cambio no trivial que no se podría realizar con el diseño actual.