Gleichzeitige Protokollierung in Konsole und Datei mit Boost

Ich benötige Hilfe bei der Initialisierung des Boost-Protokollierungs-Frameworks, um gleichzeitig sowohl in einer benannten Protokolldatei als auch in der Konsole zu protokollieren (für die benannte Protokolldatei ist keine regelmäßige Rotation oder eine der ausgefallenen Einstellungen in vielen Boost-Lernprogrammen erforderlich).

Der Protokollierungstext sollte gleichzeitig an beide Senken (Datei und Konsole) gesendet werden. Ich muss die Konsolenausgabe jedoch etwas anders formatieren, da sie von einem Benutzer angezeigt wird. Ich war in der Lage, die Grundlagen des Protokollierens zu 2 unterschiedlichen Wannen zu erhalten, die unter Verwendung des arbeitenBeispielcode steigern. Es ist viel zu komplex für das, was ich tun muss und es ist wirklich verwirrend, was den Zugriff auf den entsprechenden Logger angeht. Alles, was ich tun muss, ist, dass Nachrichten mit Zeitstempeln an die Protokolldatei gesendet werden und die gleichen Informationen ohne die Zeitstempel oder Zeilenumbrüche an das Konsolenprotokoll gesendet werden. endl streaming operations). Ich würde mich wirklich gerne an das Protokollierungsframework von boost halten, da es die Flexibilität bietet, in Zukunft zu expandieren.

Mit dem Beispiel habe ich versucht, -f die Protokolldateien - jedoch scheint die Protokollausgabe nicht nach jedem Protokolleintrag automatisch geleert zu werden. Obwohl dies für die Dateiprotokolle nicht sehr wichtig ist, ist dies für den Konsolenausgabestream von entscheidender Bedeutung, da es sich um eine Live-Aktivität handelt, die ein Benutzer überwacht.

Jede Hilfe oder noch besser, einige wirklich einfache Beispielcodes, um die Grundlagen zum Laufen zu bringen, werden sehr geschätzt.

Die Art und Weise, wie ich meine Protokollierung (über den obigen Link) einrichte, ist wie unten dargestellt. Ich möchte eine dieser registrierten Senken durch einen Konsolenprotokollierer ersetzen, bin mir jedoch nicht sicher, wie. Ich gehe davon aus, dass ein Konsolenlogger eine automatische Spülung hat.

// Setup the common formatter for all sinks
logging::formatter fmt = expr::stream
    << std::setw(6) << std::setfill('0') << line_id << std::setfill(' ')
    << ": <" << severity << ">\t"
    << expr::if_(expr::has_attr(tag_attr))
    [
        expr::stream << "[" << tag_attr << "] "
    ]
<< expr::smessage;

// Initialize sinks
typedef sinks::synchronous_sink<sinks::text_ostream_backend> text_sink;
boost::shared_ptr<text_sink> sink = 
    boost::make_shared<text_sink>();
sink->locked_backend()->add_stream(
    boost::make_shared<std::ofstream>(
        "full.log"));
sink->set_formatter(fmt);
// register the full log sink
logging::core::get()->add_sink(sink);

sink = boost::make_shared<text_sink>();
sink->locked_backend()->add_stream(
    boost::make_shared<std::ofstream>(
        "important.log"));
//    sink->set_formatter(fmt); (I removed this to not have any special formatting hopefully)
sink->set_filter(severity >= warning || 
    (expr::has_attr(tag_attr) && 
    tag_attr == "IMPORTANT_MESSAGE"));
// register the important log sink
logging::core::get()->add_sink(sink);
// Add attributes
logging::add_common_attributes();

Antworten auf die Frage(1)

Ihre Antwort auf die Frage