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 дважды, эти функции также будут вызываться дважды. Поскольку они добавляют глобальные приемники, каждая запись в журнале будет дублироваться дважды на консоли и в вашем файле.

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: Спасибо, проблема была исправлена. Еще одна вещь, если я использую потоки в примере, Как сделать так, чтобы этот вывод дублировался в каждом потоке? –

+0

@JuanSolo (убедитесь, что вы правильно вводите имена пользователей или выбираете их из появившегося списка. Я не получал уведомления о вашем сообщении.) Что вы имеете в виду? Проблема заключается в том, что 'add_console_log()' вызывается несколько раз, а не потоки. – isanae

+0

Теперь я использую файлы в примере. В этом случае «Goodbye» появляется на выходе первого регистратора. В документации говорится, что это правильное поведение. Могу ли я изменить это поведение? –