2011-12-07 1 views
22

Ho un sink sinks::text_file_backend. Dire che ho già un paio di file di log ruotati:Boost.Log - come configurare un backend del sink di testo da aggiungere ai file ruotati

myLog001.log, myLog002.log e così via

voglio il lavandino di continuare a scrivere per l'ultimo file ruotato - myLog002.log, aggiungere al suo contenuto e continua la rotazione da lì in poi.

Sono riuscito a trovare solo keywords::open_mode = append ma questo si aggiunge solo ai file myLogX esistenti, rendendoli più grandi e, naturalmente, molto difficili da leggere.

È possibile farlo in Boost.Log?

risposta

14

tale funzionalità è integrata nel lavandino testo e the documentation include un esempio per impostare il modello di nome-file e le regole per la rotazione in determinati formati e tempi:

// 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); 
} 

Non c'è apparentemente alcun modo per rendere la libreria si aggiunge ai file esistenti con questa configurazione. È necessario chiamare backend->scan_for_files(); prima di costruire sink, come mostrato nell'intestazione "Gestione di file ruotati" nella documentazione, ma ciò impedisce solo alla libreria di sovrascrivere i registri precedenti prima che siano dovuti eseguire la pulizia.

Quando questo argomento è stato pubblicato in una mailing list di sviluppo nel febbraio 2013, l'autore della libreria ha spiegato che adding support for appending would be a nontrivial change non è stato possibile eseguire con il progetto corrente.

+0

Io uso backend-> scan_for_files(); nel mio programma, ma il programma si è bloccato durante l'esecuzione di questo codice. Qualche idea su questo? –

+0

La rotazione funziona, ma per quanto riguarda l'aggiunta? Un programma deve essere aggiunto all'ultimo log, per ogni esecuzione successiva del programma, fino a quando il file di registro raggiunge i limiti di rotazione. Questo codice crea un nuovo file di registro in ogni esecuzione e l'aggiunta di 'scan_for_files' non ha alcun effetto. – ixe013

+0

Hai ragione, @ Ixe013. Ho rivisto la mia risposta. –

1

È necessario specificare il metodo open_mode prima di utilizzare il file di testo. Per impostazione predefinita, Boost.Log utilizzerà std :: ios_base :: trunc | std :: ios_base :: out come modalità aperta che ovviamente troncerà il vecchio file di registro.

È possibile creare text_file_backend esempio con i seguenti parametri:

{ 
     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); 
    }