2013-08-02 16 views
10

Używam boostu 1.54.0. Poniżej znajduje się minimalny przykład ilustrujący mój problem.Boost log severity_logger init_from_stream

Używam severity_logger dziennika boost. Chcę skonfigurować moje zlewy ze strumienia. (W poniższym przykładzie używam strumienia strunowego W mojej prawdziwej aplikacji strumień pochodzi z pliku.) Chcę użyć% istotności% dla celów wyjściowych lub filtrowania.

Mój problem jest: Jeśli użyję go tak, jak podano w poniższym przykładzie, % Ważność% jest pusta.

% LineID% i% Message% są wypełniane zgodnie z oczekiwaniami. Jeśli ustawię zlew tak, jak podano w liniach nieokreślonych, działa zgodnie z oczekiwaniami.

Wszelkie pomysły?

#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

Byłoby appeat że musisz polecić Boost Log, aby rzeczywiście używać 'Sinks.MySink'. Niestety, nie mam doświadczenia z konfiguracją Boost Log – sehe

+0

To nie jest problem. Używa MySink. Format I dostarczany jest zgodnie z oczekiwaniami. Z wyjątkiem:% Ważność% zostaje zastąpiony pustym łańcuchem. Powinien to być numer wartości wyliczeniowej. Sprawdza się dobrze, z optymalnym sposobem konfiguracji zlewu. – SebastianK

Odpowiedz

10

Masz rację. Jest to znany błąd i naprawiony w aktualnej wersji rozwojowej.

Oto raport o błędzie: https://svn.boost.org/trac/boost/ticket/8840

Aby ta odpowiedź jest mniej zależny od łącza oto sposób został rozwiązany w raporcie:

Musisz zarejestrować swoją ważności atrybut w biblioteka przed analizą pliku ustawień. Zobacz here. Atrybut może być zarejestrowany zarówno dla parterów formatera, jak i filtrów, jeśli chcesz filtrować rekordy na podstawie poziomu istotności.

OK, to działa, ale musiałem dodać wejściowy strumień funkcję/ekstrakcja i potem musiałem dodać następujące dwa wiersze przed załadowaniem ustawień z pliku ustawień:

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

Jesteś mężczyzną. Zajęło mi to 2 dni, aż natknąłem się na twój wpis, ponieważ wierzyłem, że popełniłem błąd konfiguracji ... – quaylar

+2

Kilka lat później ... Boost jest wersją 1.62, a ja trafiałem na ten sam problem w ciągu ostatnich 2 dni. Dzięki tej odpowiedzi udało mi się sprawić, że "Ciężkość" działa. – Rado