2016-12-14 4 views
1

Ich benutze triviale Protokollierung von boost::log Bibliothek und ich möchte einige Code je nach aktuell eingestellten Schweregrad Logger ausführen. Dies wird nur benötigt, um eine Protokollnachricht aufzubauen, wenn sie ausgegeben wird. Aber ich kann nicht den richtigen Weg finden, um den Schweregrad abzufragen. Der Code muss so etwas wie:Wie boost :: log Schweregrad abfragen?

if (boost::log::trivial::severity <= 
    boost::log::trivial::severity_level::trace) 
{ 
    // construct log message 
    BOOST_LOG_TRIVIAL(trace) << message; 
} 

Darüber hinaus gibt sein kann, ist eine Möglichkeit, wenn ich weiß, dass die Nachricht eine doppelte Überprüfung Schwere und Ausgabe, die es direkt statt BOOST_LOG_TRIVIAL Makro verwenden zu vermeiden ausgegeben werden?

Antwort

1

Es funktioniert nicht so. Sie benötigen eine Filterfunktion zur Verfügung zu stellen boost :: log :: trivial gemäß der Dokumentation:

http://www.boost.org/doc/libs/1_61_0/libs/log/doc/html/log/tutorial/trivial_filtering.html

void init() 
{ 
    logging::core::get()->set_filter 
    (
     // here they've used a constant but you could use a global or 
     // a function 
     logging::trivial::severity >= logging::trivial::info 
    ); 
} 

int main(int, char*[]) 
{ 
    init(); 

    BOOST_LOG_TRIVIAL(trace) << "A trace severity message"; 
    BOOST_LOG_TRIVIAL(debug) << "A debug severity message"; 
    BOOST_LOG_TRIVIAL(info) << "An informational severity message"; 
    BOOST_LOG_TRIVIAL(warning) << "A warning severity message"; 
    BOOST_LOG_TRIVIAL(error) << "An error severity message"; 
    BOOST_LOG_TRIVIAL(fatal) << "A fatal severity message"; 

    return 0; 
} 

Das Objekt logging::core::set_filter vergangen ist vom Typ boost::log::filter

Sie könnten genauso gut schreiben:

auto filt = logging::filter(logging::trivial::severity >= logging::trivial::info); 
logging::core::get()->set_filter(filt); 

filt ist ein leichtes Funktionsobjekt, deren Aufgabe es ist, zu inspizieren die an sie gesendeten Attribute und gibt zurück, ob alle Tests mit diesen Attributen true zurückgeben. In diesem Fall gibt es nur einen Test - logging::trivial::severity >= logging::trivial::info.

Es ist die Aufgabe des Loggers, den Attributsatz zu erstellen und ihn an boost::log::core zu übergeben, wenn er etwas ausgeben möchte.

Die lange und kurze davon ist, dass Sie die Protokollierungsstufe in Ihrer eigenen Variable verfolgen müssen. Hier ist eine Möglichkeit:

#include <iostream> 
#include <boost/log/core.hpp> 
#include <boost/log/trivial.hpp> 
#include <boost/log/expressions.hpp> 

namespace logging = boost::log; 


int main(int, char*[]) 
{ 
    // track your own variable here 
    logging::trivial::severity_level my_log_level = logging::trivial::trace; 

    // with this filter 
    auto filt = logging::filter(logging::trivial::severity >= my_log_level); 
    logging::core::get()->set_filter(filt); 

    BOOST_LOG_TRIVIAL(trace) << "A trace severity message"; 
    BOOST_LOG_TRIVIAL(debug) << "A debug severity message"; 
    BOOST_LOG_TRIVIAL(info) << "An informational severity message"; 
    BOOST_LOG_TRIVIAL(warning) << "A warning severity message"; 
    BOOST_LOG_TRIVIAL(error) << "An error severity message"; 
    BOOST_LOG_TRIVIAL(fatal) << "A fatal severity message"; 

    // now you have control 
    if (my_log_level <= logging::trivial::trace) 
    { 
     std::cout << "tracing\n"; 
    } 


    return 0; 
} 
+0

Dies beantwortet die Frage nicht. Es muss einen Weg geben, um beliebigen Code abhängig vom Schweregrad bedingt auszuführen. – bobeff

+0

Wird die Antwort konkretisieren. Leider nehmen Sie falsch an –

+0

@bobeff Antwort aktualisiert mit Beispiel, wie Sie Ihre eigene Protokollierungsstufe verfolgen –

Verwandte Themen