2013-08-02 4 views
10

Sto usando boost 1.54.0. Di seguito puoi trovare un esempio minimo che illustra il mio problema.Boost log severity_logger init_from_stream

Uso severity_logger del registro di potenziamento. Voglio configurare i miei sink da uno stream. (Nell'esempio seguente utilizzo uno strings. Nella mia vera applicazione il flusso proviene da un file.) Voglio usare% Gravità% per scopi di output o di filtraggio.

mio problema è: se lo uso come indicato nel seguente esempio, % Gravità% è vuoto.

% LineID% e% Message% vengono riempiti come previsto. Se imposto un sink come indicato nelle linee in uscita, funziona come previsto.

Qualche idea?

#include <boost/log/sources/severity_logger.hpp> 
#include <boost/log/sources/record_ostream.hpp> 
#include <boost/log/utility/setup/common_attributes.hpp> 
#include <boost/log/utility/setup/from_stream.hpp> 
#include <boost/log/utility/setup/console.hpp> 
#include <boost/log/expressions.hpp> 

enum SeverityLevel { trace, fatal }; 

int main (int argc, char *argv[]) 
{ 
    boost::log::add_common_attributes(); 
    /* 
    struct severity_tag; 
    boost::log::add_console_log(std::clog, 
     boost::log::keywords::format = (
      boost::log::expressions::stream 
       << boost::log::expressions::attr< unsigned int >("LineID") 
       << ": <" << boost::log::expressions::attr<SeverityLevel, severity_tag >("Severity") 
       << "> " << boost::log::expressions::smessage) 
    ); */ 

    std::stringstream s; 
    s << "[Sinks.MySink]" << std::endl; 
    s << "Destination=Console" << std::endl; 
    s << "Format=\"%LineID%: <%Severity%> - %Message%\"" << std::endl; 
    boost::log::init_from_stream(s); 

    boost::log::sources::severity_logger<SeverityLevel> lg; 
    BOOST_LOG_SEV(lg, trace) << "This is a trace message"; 
    BOOST_LOG_SEV(lg, fatal) << "This is a fatal message"; 
    return 0; 
} 
+0

Sarebbe appeat che è necessario istruire Boost Log per utilizzare effettivamente 'Sinks.MySink'. Purtroppo non ho esperienza con la configurazione di Boost Log – sehe

+0

Questo non è un problema. Sta usando MySink. Il formato I fornito viene utilizzato come desiderato. Tranne:% Severity% è sostituito da una stringa vuota. Dovrebbe essere il numero del valore enum. Funziona alla perfezione con il modo in cui si verifica la configurazione del sink. – SebastianK

risposta

10

Hai ragione. Questo è un bug noto e risolto nella versione di sviluppo corrente.

Ecco il bug report: https://svn.boost.org/trac/boost/ticket/8840

Per rendere la risposta meno dipendente sul link qui è il modo in cui è stato risolto all'interno del report:

È necessario registrare l'attributo gravità nel libreria prima di analizzare il file delle impostazioni. Vedi here. Potrebbe essere necessario registrare l'attributo sia per il formattatore che per i parser dei filtri, se si desidera filtrare i record in base al livello di gravità.

OK, questo sta lavorando, ma ho dovuto aggiungere una funzione di ingresso flusso/estrazione e poi ho dovuto aggiungere le seguenti due righe prima di caricare le impostazioni dal file di impostazioni:

logging::register_simple_formatter_factory<ESeverityLevel, char>("Severity"); 
logging::register_simple_filter_factory<ESeverityLevel, char>("Severity"); 
+2

Sei l'uomo. Mi ci sono voluti 2 giorni finché non sono incappato nel tuo post perché credevo di aver fatto un errore di configurazione ... – quaylar

+2

Pochi anni dopo ... Boost è la versione 1.62 e ho riscontrato lo stesso problema negli ultimi 2 giorni. Grazie a questa risposta sono riuscito a far funzionare il "Severity". – Rado