2016-05-09 11 views
0

Ich habe einige Probleme mit Boost Event Logger. Wenn ich versuche, das Ereignisprotokoll mit BOOST_LOG_TRIVIAL zu protokollieren, erhalte ich keine Schweregrade in der Ereignisanzeige. (Alles wird als Information angezeigt, aber nicht als Warnung, Fehler usw.) Die Boost-Bibliothek ist dynamisch mit der Anwendung verknüpft. Ich benutze 1.57 Version der Bibliothek.Boost Ereignisprotokoll zeigt Ereignisse nicht richtig an

Hier ist Screenshot. Jedes Ereignis sollte als Warnung angezeigt werden, tut dies aber nicht. Event log view

Hier ist mein init Code:

try 
{ 
    boost::log::add_common_attributes(); //edit 
    boost::shared_ptr<sink_t> sink(new sink_t 
     (
     log_name = "test_app", 
     log_source = "test_app" 
     )); 

    sink->set_formatter 
     (
     expr::format("[%1%] - %2%") 
     % expr::attr<ptime>("TimeStamp") 
     % expr::smessage 
     ); 

    sinks::event_log::custom_event_type_mapping<MessageSeverity> mapping("Severity"); 
    mapping[MessageSeverity::error] = sinks::event_log::error; 
    mapping[MessageSeverity::warning] = sinks::event_log::warning; 
    mapping[MessageSeverity::info] = sinks::event_log::info; 

    sink->locked_backend()->set_event_type_mapper(mapping); 
    core::get()->add_sink(sink); 
} 
catch (const std::exception &e) 
{ 
    BOOST_LOG_TRIVIAL(fatal) << e.what(); 
} 

Und hier ist, wie ich Ereignisse protokollieren

void Logger::log(MessageSeverity severity, const std::string & msg) 
{ 
    switch (severity) 
    { 
    case MessageSeverity::info: 
     BOOST_LOG_TRIVIAL(info) << msg; 
     break; 

    case MessageSeverity::warning: 
     BOOST_LOG_TRIVIAL(warning) << msg; 
     break; 

    case MessageSeverity::error: 
     BOOST_LOG_TRIVIAL(error) << msg; 
     break; 

    default: 
     break; 
    } 
} 

Antwort

2

BOOST_LOG_TRIVIAL emittiert Protokolldatensätze mit dem Schweregrad Typ mit boost::log::trivial::severity_level. Das ist der Typ der Attributwerte, die Sie in der custom_event_type_mapping, nicht der MessageSeverity erwarten sollten. Da der Typ nicht übereinstimmt, kann die Bibliothek den Schweregrad nicht aus Protokolldatensätzen extrahieren und verwendet sinks::event_log::info als zugeordneten Ereignistyp als Fallback.

Sie sollten entweder boost::log::trivial::severity_level im Mapper für Ereignistypen verwenden oder logger, spezialisiert für MessageSeverity.

boost::log::sources::severity_logger<MessageSeverity> lg; 
BOOST_LOG_SEV(lg, MessageSeverity::warning) << "Hello, warning."; 
+0

Es funktioniert, danke! – Cfanny

0

Haben Sie versucht, Ihre Log-Level auf die Schwere Attribut registrieren? Diese

, was ich verwenden würde:

#include <boost/log/expressions.hpp> 
... 
BOOST_LOG_ATTRIBUTE_KEYWORD(severity, "Severity", MessageSeverity); 

Auch Ihre Logging-Anrufe noch boost Schweregrad verwenden.

aktualisieren es wie folgt aus (/ \ Ungeprüfte!):

void Logger::log(MessageSeverity severity, const std::string & msg) 
{ 
    switch (severity) 
    { 
     case MessageSeverity::info: 
     case MessageSeverity::warning: 
     case MessageSeverity::error: 
     BOOST_LOG_TRIVIAL(severity) << msg; 
     default: 
     break; 
    } 
} 
+0

Ich verwende 'boost :: log :: add_common_attributes();'. Ich habe versucht, Makro-Version, aber es hat nicht funktioniert. Ich habe vergessen, das zu erwähnen :) – Cfanny

+0

Okay, können Sie zeigen, wie Sie die Protokollierungsfunktionen aufrufen? (Bearbeiten Sie Ihre Frage dazu) – Tezirg

+0

Ok, fertig :) Soll ich ein anderes Makro anstelle von 'BOOST_LOG_TRIVIAL' verwenden? – Cfanny