2016-08-23 15 views
1

Ich lerne die Boost.Log-Bibliothek. Ich möchte Nachrichten an eine Datei senden und std::clog. Ich habe die folgende Klasse:Boost.Log: Warum wird die Nachricht doppelt angezeigt?

class logger 
{ 
    public: 
     explicit logger(
      const std::string& tag, 
      const std::string& file, 
      bool console 
     ) 
     { 
      boost::log::register_simple_formatter_factory< boost::log::trivial::severity_level, char >("Severity"); 

      std::string the_format = "[%TimeStamp%] (%LineID%) [%Severity%]"; 
      if(!tag.empty()) { 
       m_log_.add_attribute(
        "Tag", 
        boost::log::attributes::constant<std::string>(tag) 
       ); 
       the_format += " [%Tag%]"; 
      } 

      the_format += ": %Message%"; 

      if(console) { 
       boost::log::add_console_log(
        std::clog, 
        boost::log::keywords::auto_flush = true, 
        boost::log::keywords::format = the_format 
       ); 
      } 

      if(!file.empty()) { 
       boost::log::add_file_log(
        boost::log::keywords::file_name = file, 
        boost::log::keywords::auto_flush = true, 
        boost::log::keywords::open_mode = (std::ios::out | std::ios::app), 
        boost::log::keywords::format = the_format 
       ); 
      } 

     } 

     ~logger(void) 
     { } 

     void log(
      const std::string& msg 
     ) 
     { 
      BOOST_LOG_SEV (m_log_, boost::log::trivial::info) << msg; 
     } 

    private: 
     boost::log::sources::severity_logger<boost::log::trivial::severity_level> m_log_; 

}; // logger 

Ich habe folgende main() Funktion:

void x() 
{ 
    logger lg("omega", "", true); 
    lg.log("Goodbye"); 
} 

int main(int argc, char** argv) 
{ 
    logger lg("alfa", "", true); 
    lg.log("Hello world!!!"); 
    x(); 
    return 0; 
} 

Ich verstehe nicht, warum die doppelte Nachricht angezeigt: "Hallo Welt !!!":

[2016-Aug-23 17:51:36.852912] (1) [info] [alfa]: Hello world!!! 
[2016-Aug-23 17:51:36.853359] (2) [info] [omega]: Goodbye 
[2016-Aug-23 17:51:36.853359] (2) [info] [omega]: Goodbye 

UPDATE: Entschuldigung, das Beispiel war unvollständig.

+0

Welche Boost-Version verwenden Sie? Ich kann das nicht mit 1.58 reproduzieren. Welche Plattform? – isanae

+0

@isanae, es tut mir leid, das Beispiel war unvollständig. Ich benutze die Version 1.60 und das Betriebssystem ist GNU/Linux. –

Antwort

1

logger Der Konstruktor ruft add_console_log() und add_file_log(). Wenn Sie zweimal logger konstruieren, werden diese Funktionen auch zweimal aufgerufen. Da sie globale Senken hinzufügen, wird jeder Protokolleintrag zweimal auf der Konsole und in Ihrer Datei dupliziert.

int main(int argc, char** argv) 
{ 
    logger lg1("1", "", true); 
    logger lg2("2", "", true); 
    logger lg3("3", "", true); 
    logger lg4("4", "", true); 

    lg1.log("test"); 
} 

erhalten Sie folgende Ausgabe:

[2016-Aug-23 13:25:56.468382] (1) [info] [1]: test 
[2016-Aug-23 13:25:56.468382] (1) [info] [1]: test 
[2016-Aug-23 13:25:56.468382] (1) [info] [1]: test 
[2016-Aug-23 13:25:56.468382] (1) [info] [1]: test 

Sie wahrscheinlich eine Art von Referenzzähler oder Flag wollen nur einmal diese Funktionen aufrufen.

+0

@isanea: Danke, das Problem wurde behoben. Eine weitere Sache, wenn ich Streams in dem Beispiel verwende, Wie verhindert man, dass diese Ausgabe in jedem Stream dupliziert wird? –

+0

@JuanSolo (Stellen Sie sicher, dass Sie Benutzernamen richtig eingeben, oder wählen Sie sie aus der Liste, die angezeigt wird. Ich habe keine Benachrichtigung über Ihre Nachricht erhalten.) Was meinst du? Das Problem ist, dass 'add_console_log()' mehrmals aufgerufen wird, nicht Streams. – isanae

+0

Jetzt verwende ich Dateien in dem Beispiel. In diesem Fall erscheint "Goodbye" am Ausgang des ersten Loggers. Die Dokumentation besagt, dass dieses Verhalten korrekt ist. Kann ich dieses Verhalten ändern? –

Verwandte Themen