2016-09-13 3 views
0

Gibt es in boost::log eine Möglichkeit, nur einen Teil der Protokollnachricht zu berücksichtigen, wenn sie zu lang ist (z. B. 1000 Zeichen)? Dies wäre nützlich, wenn variabler Inhalt verfolgt werden soll, wobei die Gesamtheit der Informationen nicht zwingend erforderlich ist, um die benötigten Informationen herauszufinden.Boost Log cut lange Protokollmeldungen

Zum Beispiel: Wenn ich einen String mit der Dateiliste aus dem aktuellen Verzeichnis drucke, muss ich nicht die gesamte Liste sehen, um zu wissen, ob das Dateisystem erfolgreich gescannt wurde.

boost::log::add_file_log 
(
    boost::log::keywords::file_name = "logs/Log_%Y-%m-%d_%H-%M-%S.log", 
    boost::log::keywords::rotation_size = 10 * 1024 * 1024, 
    boost::log::keywords::time_based_rotation = boost::log::sinks::file::rotation_at_time_point(0, 0, 0), 
    boost::log::keywords::auto_flush = true, 
    boost::log::keywords::format = 
    (
     boost::log::expressions::stream 
     << boost::log::expressions::format_date_time<boost::posix_time::ptime>("TimeStamp", "%Y-%m-%d %H:%M:%S:%f") 
     << " [" << boost::log::expressions::attr<boost::log::attributes::current_thread_id::value_type>("ThreadID") << "]" 
     << ": <" << boost::log::trivial::severity << "> " 
     << boost::log::expressions::smessage 
    ) 
); 

Z. B .: kann boost::log::expressions::smessage wie boost::log::expressions::smessage::substr(0, 1000) oder in irgendeiner anderen Art und Weise angepasst werden?

Antwort

2

Seit Boost 1.62 gibt es einen max_size_decor Dekorateur, der tut, was Sie fragen. Sie können es wie folgt verwenden:

boost::log::add_file_log 
(
    boost::log::keywords::file_name = "logs/Log_%Y-%m-%d_%H-%M-%S.log", 
    boost::log::keywords::rotation_size = 10 * 1024 * 1024, 
    boost::log::keywords::time_based_rotation = boost::log::sinks::file::rotation_at_time_point(0, 0, 0), 
    boost::log::keywords::auto_flush = true, 
    boost::log::keywords::format = 
    (
     boost::log::expressions::stream 
     << boost::log::expressions::format_date_time<boost::posix_time::ptime>("TimeStamp", "%Y-%m-%d %H:%M:%S:%f") 
     << " [" << boost::log::expressions::attr<boost::log::attributes::current_thread_id::value_type>("ThreadID") << "]" 
     << ": <" << boost::log::trivial::severity << "> " 
     << boost::log::expressions::max_size_decor(1000) 
     [ 
      boost::log::expressions::stream << boost::log::expressions::smessage 
     ] 
    ) 
); 

Der Dekorateur begrenzt den Ausgang des angenommenen Formatierer auf die angegebene Anzahl von Zeichen.

Sie können auch einen eigenen Formatierer erstellen. Es gibt this Antwort beschreiben mehrere Möglichkeiten, das zu tun. Zum Beispiel, Sie boost::phoenix::bind verwenden könnten Ihre Funktion zu wickeln, die die Größe zu begrenzen tun würden:

boost::string_view limit_size(boost::log::value_ref< 
    std::string, boost::log::expressions::tag::smessage > const& message) 
{ 
    if (!message) 
    { 
     // No message attribute in the log record 
     return boost::string_view(); 
    } 

    boost::string_view msg = message.get(); 
    return msg.substr(0, 1000); 
} 

boost::log::add_file_log 
(
    boost::log::keywords::file_name = "logs/Log_%Y-%m-%d_%H-%M-%S.log", 
    boost::log::keywords::rotation_size = 10 * 1024 * 1024, 
    boost::log::keywords::time_based_rotation = boost::log::sinks::file::rotation_at_time_point(0, 0, 0), 
    boost::log::keywords::auto_flush = true, 
    boost::log::keywords::format = 
    (
     boost::log::expressions::stream 
     << boost::log::expressions::format_date_time<boost::posix_time::ptime>("TimeStamp", "%Y-%m-%d %H:%M:%S:%f") 
     << " [" << boost::log::expressions::attr<boost::log::attributes::current_thread_id::value_type>("ThreadID") << "]" 
     << ": <" << boost::log::trivial::severity << "> " 
     << boost::phoenix::bind(&limit_size, boost::log::expressions::smessage.or_none()) 
    ) 
); 

In diesem Beispiel erstellt phoenix::bind ein Wrapper-Funktion Objekt, das den Nachrichtenwert aus dem Protokollsatz extrahiert Attribut und übergibt sie in der limit_size Funktion in der value_ref Referenzwrapper gewickelt. Wenn der Protokolldatensatz keine Nachricht enthält, ist der Referenzwrapper leer (das tut or_none). Was immer limit_size zurückgibt, wird als Teil des Formatierungsprozesses in den Stream ausgegeben. In diesem Fall können Sie boost::string_view oder boost::string_ref verwenden, um das Kopieren der Zeichenfolge zu vermeiden.

Verwandte Themen