2013-08-02 6 views
10

Ich verwende Boost 1.54.0. Unten finden Sie ein minimales Beispiel, das mein Problem veranschaulicht.Boost Log Schweregrad_logger Init_from_stream

Ich verwende den severity_logger Boost-Log. Ich möchte meine Senken aus einem Stream konfigurieren. (Im folgende Beispiel verwende ich eine string. In meiner realen Anwendung der Strom kommt aus einer Datei.) ich das% Severity% für die Ausgabe oder Filterzweck verwendet werden soll.

Mein Problem ist: Wenn ich es wie im Beispiel unten verwendet, % Schweregrad% ist leer.

% LineID% und% Message% werden als erwartet gefüllt. Wenn ich eine Senke wie in den Outcomment-Zeilen eingerichtet habe, funktioniert es wie erwartet.

Irgendwelche Ideen?

#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

Es wäre appeat dass Sie Boost Log anweisen müssen, 'Sinks.MySink' zu verwenden. Leider habe ich keine Erfahrung mit Boost Log Konfiguration – sehe

+0

Das ist nicht das Problem. Es benutzt MySink. Das von mir bereitgestellte Format wird wie gewünscht verwendet. Ausnahme:% Schweregrad% wird durch eine leere Zeichenfolge ersetzt. Es sollte die Nummer des Enum-Wertes sein. Es funktioniert gut mit der Outcomment Art der Sink-Konfiguration. – SebastianK

Antwort

10

Sie haben Recht. Dies ist ein bekannter Fehler und wurde in der aktuellen Entwicklungsversion behoben. Hier

ist der Bug-Report: https://svn.boost.org/trac/boost/ticket/8840

Um diese Antwort weniger abhängig von dem Link hier ist so, wie es im Bericht aufgelöst wurde:

Sie benötigen Schweres Attribut in der Registrierung Bibliothek vor dem Parsen der Einstellungsdatei. Siehe here. Das Attribut muss möglicherweise für Formatierungs- und Filterparser registriert werden, wenn Sie Datensätze basierend auf dem Schweregrad filtern möchten.

OK, das funktioniert, aber ich hatte einen Stream Input/Extraktionsfunktion hinzufügen und dann hatte ich die folgenden zwei Zeilen hinzufügen, bevor Sie die Einstellungen aus den Einstellungen Laden der Datei:

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

Du bist der Mann. Nahm mich 2 Tage, bis ich auf deinen Posten stolperte, weil ich glaubte, dass ich einen Config-Fehler gemacht hatte ... – quaylar

+2

Wenige Jahre später ... Boost ist Version 1.62 und ich traf das gleiche Problem in den letzten 2 Tagen. Dank dieser Antwort konnte ich die "Severity" funktionierend machen. – Rado