2016-08-23 2 views
1

私はBoost.Logライブラリを学んでいます。私はファイルにメッセージを送ろうとしており、std::clogです。私は、次のクラスがあります。Boost.Log:なぜメッセージが重複して表示されていますか?

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 

私は、次のmain()機能があります。

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; 
} 

を重複メッセージが表示されている理由を私は理解していない: "こんにちは、世界を!!!":

[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 

更新:申し訳ありませんが、例は不完全でした。

+0

どのバージョンのブーストを使用していますか?私は1.58でこれを再現することはできません。どのプラットフォーム? – isanae

+0

@isanae、申し訳ありませんが、例は不完全でした。私はバージョン1.60を使用しており、osはGNU/Linuxです。 –

答えて

1

loggerのコンストラクタは、add_console_log()add_file_log()を呼び出しています。 loggerを2回構築すると、これらの関数も2回呼び出されます。グローバルシンクを追加するため、すべてのログエントリはコンソールとファイルに2回複製されます。

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"); 
} 

この意志出力:

[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 

おそらく、参照カウントまたはフラグのいくつかの並べ替えは一度だけ、これらの関数を呼び出したいです。

+0

@isanea:ありがとう、問題は修正されました。もう1つ、例でストリームを使用する場合、そのストリームがすべてのストリームで重複しないようにするにはどうすればよいですか? –

+0

@JuanSolo(ユーザー名を正しく入力するか、ポップアップリストから選択してください)あなたのメッセージに関する通知はありませんでした。問題は 'add_console_log()'がストリームではなく複数回呼び出されることです。 – isanae

+0

ここでは、例のファイルを使用します。この場合、最初のロガーの出力には「さようなら」が表示されます。ドキュメントは、この動作が正しいことを示しています。この動作を変更することはできますか? –

関連する問題