Boost-Log 2.0 : leer Schweregrad in logs
Ich bin mit Boost-Log 2.0, die einige Unterschiede von version 1, und ich habe eine harte Zeit der Ausgabe der "Schwere" - Attribut.
Bin ich mit dem "Boost".Format-Stil" Formatierer
"%TimeStamp% [%Uptime%] (%LineID%) <%Severity%>: %Message%"
TimeStamp
, LineID
, und Message
sind common_attributes
. Uptime
ist ein Attribut Hinzugefügt habe ich mit attrs::timer()
. Ich dachte, dass Severity
wurde automatisch Hinzugefügt, wenn mit severity_logger
, aber anscheinend ist es nicht und das ist mein problem. Ich bekomme leere Schweregrade, z.B.:
2013-Apr-06 19:21:52.408974 [00:00:00.001337] (3) <>: A warning severity message
Beachten Sie die leeren <>
. Ich habe versucht, um schwere mit register_simple_formatter_factory
aber dann bekomme ich den compiler-Fehler :
error: no matching function for call to ‘register_simple_formatter_factory(const char [9])’
und ich verstehe nicht, warum.
Hier ist mein code :
#include <iostream>
#include <boost/log/common.hpp>
#include <boost/log/core.hpp>
#include <boost/log/trivial.hpp>
#include <boost/log/expressions.hpp>
#include <boost/log/sinks/text_file_backend.hpp>
#include <boost/log/sinks/sync_frontend.hpp>
#include <boost/log/sinks/text_ostream_backend.hpp>
#include <boost/log/utility/setup/file.hpp>
#include <boost/log/utility/setup/common_attributes.hpp>
#include <boost/log/utility/setup/formatter_parser.hpp>
#include <boost/log/sources/severity_logger.hpp>
#include <boost/log/sources/severity_feature.hpp>
#include <boost/log/sources/record_ostream.hpp>
#include <boost/log/attributes.hpp>
using namespace std;
namespace logging = boost::log;
namespace expr = boost::log::expressions;
namespace attrs = boost::log::attributes;
namespace src = boost::log::sources;
namespace keywords = boost::log::keywords;
enum severity_level
{
DEBUG,
INFO,
WARNING,
ERROR,
CRITICAL
};
BOOST_LOG_INLINE_GLOBAL_LOGGER_DEFAULT(my_logger, src::severity_logger_mt< severity_level> )
//The formatting logic for the severity level
template< typename CharT, typename TraitsT >
inline std::basic_ostream< CharT, TraitsT >& operator<< (
std::basic_ostream< CharT, TraitsT >& strm, severity_level lvl)
{
static const char* const str[] =
{
"DEBUG",
"INFO",
"WARNING",
"ERROR",
"CRITICAL"
};
if (static_cast< std::size_t >(lvl) < (sizeof(str) / sizeof(*str)))
strm << str[lvl];
else
strm << static_cast< int >(lvl);
return strm;
}
void init() {
//logging::register_simple_formatter_factory< severity_level >("Severity");
logging::add_file_log(
keywords::file_name = "blop.log",
keywords::auto_flush = true,
keywords::open_mode = (std::ios::out | std::ios::app),
keywords::format = "%TimeStamp% [%Uptime%] (%LineID%) <%Severity%>: %Message%"
);
logging::add_common_attributes();
logging::core::get()->add_global_attribute("Uptime", attrs::timer());
}
int main(int argc, const char *argv[]) {
init();
src::severity_logger_mt< severity_level > lg = my_logger::get();
BOOST_LOG_SEV(lg, DEBUG) << "A debug severity message";
BOOST_LOG_SEV(lg, INFO) << "An informational severity message";
BOOST_LOG_SEV(lg, WARNING) << "A warning severity message";
BOOST_LOG_SEV(lg, ERROR) << "An error severity message";
BOOST_LOG_SEV(lg, CRITICAL) << "A critical severity message";
return 0;
}
Beachten Sie die auskommentierte Zeile :
//logging::register_simple_formatter_factory< severity_level >("Severity");
hervorbringt, die den erwähnten Fehler.
Ich es kompilieren mit:
g++ main.cpp -Wall -DBOOST_ALL_DYN_LINK -lboost_system -lboost_log_setup -lboost_log -lboost_filesystem -lboost_date_time -lboost_thread -o main
- Vielleicht ist diese Frage im Zusammenhang: stackoverflow.com/questions/18014335/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Lief in das gleiche problem (leere %Schwere% in der log-Datei UND die gleichen compiler-Fehler, wenn Sie versuchen, um die Funktion register).
Ich fand, dass der Aufruf zu register_simple_formatter_factory werden sollte:
add_file_log
(oder ähnlich) nennen, sonst funktioniert es nicht still.Hier ist der Prototyp
register_simple_formatter_factory
Funktion Vorlage:Das bedeutet, dass Sie vergessen
typename CharT
, so, hier ist der richtige:Oder andere Charakter-Typen, wie
wchar_t
.Können Sie Ihr eigenes backend und rufen set_formatter auf Sie. Hier ist mein code, die zeigen, wie es zu tun, plus ein paar Ergänzungen, wie die log-Datei "cleanup" und " auto-flush:
außerdem können Sie den Protokolliergrad festlegen als:
Hinweis: Dieser code ist aus meiner eigenen repository. dreamdridge ist der Produkt-name, daher der namespaces.
Der Grund dafür könnte sein, dass Sie sollten nicht Daten schreiben std::ostream.
boost.log-boost verwendet.log.formatting_ostream Ausgabe meldet, nicht std::ostream.
bitte finden Sie in der dieser code entnommen von Seite http://www.boost.org/doc/libs/1_54_0/libs/log/doc/html/log/detailed/expressions.html
Korrigiert wird, wie der Aufruf zum registrieren des formatter (d.h.
operator<<
), wie hingewiesen, durch die Antworten von W. Merrt und Matt Yang ist alles, was Sie brauchen, um Ihren aktuellen code zu kompilieren und korrekt ausgeführt werden.Jedoch, um den vollen nutzen der Boost-Log-Filterung Funktionen, die Sie auch brauchen, um zu definieren
operator>>
für Ihre individuelle Schweregrade und dann zu registrieren, die Methode mit der filter-factory.