2016-03-21 3 views
0

logger.hBoost.log создать текстовый файл бэкенд вручную

enum ChannelType { 
    main_channel, 
    sub_channel 
}; 
BOOST_LOG_ATTRIBUTE_KEYWORD(channel, "Channel", ChannelType) 

class Logger { 
public: 
    enum severity_level 
    { 
     debug, 
     info, 
     warning, 
     error, 
     fatal 
    }; 
    static void init(Logger::severity_level level); 
    typedef boost::log::sources::severity_channel_logger< Logger::severity_level, ChannelType > logger_type; 
    static thread_local logger_type gl; 
    static thread_local logger_type motion_checker; 
}; 

Logger.cpp

void Logger::init(Logger::severity_level level) 
    { 
     boost::shared_ptr<boost::log::core> core = boost::log::core::get(); 
     core->set_exception_handler(boost::log::make_exception_suppressor()); 
     core->set_filter(boost::log::expressions::attr<Logger::severity_level>("Severity") >= level); 
     { 
      typedef boost::log::sinks::asynchronous_sink<boost::log::sinks::text_multifile_backend> multifile_sink; 
      boost::shared_ptr<multifile_sink> sink(new multifile_sink); 
      sink->locked_backend()->set_file_name_composer(boost::log::sinks::file::as_file_name_composer(
       boost::log::expressions::stream << "./log/Sub/" << boost::log::expressions::attr<std::string>("RoleName") << ".log")); 
      sink->set_formatter 
       (
        boost::log::expressions::format("[%1%] - %2%") 
        % boost::log::expressions::attr<boost::posix_time::ptime>("TimeStamp") 
        % boost::log::expressions::smessage 
        ); 
      sink->set_filter(channel == sub_channel); 
      core->add_sink(sink); 
     } 
//============use add_file_log============== 
     boost::log::add_file_log(
      boost::log::keywords::filter = channel == main_channel, 
      boost::log::keywords::file_name = "./log/%Y%m%d.log", 
      boost::log::keywords::auto_flush = true, 
      boost::log::keywords::open_mode = (std::ios::out | std::ios::app), 
      boost::log::keywords::time_based_rotation = boost::log::sinks::file::rotation_at_time_point(0, 0, 0), 
      boost::log::keywords::format = "[%TimeStamp%] (%LineID%) {%ThreadID%}: %Message%" 
      ); 
//==================use add_file_log end==================== 
//=========manually add sink, this has problem================ 
     boost::shared_ptr<boost::log::sinks::text_file_backend> backend = 
      boost::make_shared<boost::log::sinks::text_file_backend>(
       boost::log::keywords::filter = channel == main_channel, 
       boost::log::keywords::file_name = "./log/%Y%m%d.log", 
       boost::log::keywords::auto_flush = true, 
       boost::log::keywords::open_mode = (std::ios::out | std::ios::app), 
       boost::log::keywords::time_based_rotation = boost::log::sinks::file::rotation_at_time_point(0, 0, 0), 
       boost::log::keywords::format = "[%TimeStamp%] (%LineID%) {%ThreadID%}: %Message%" 
       ); 
     typedef boost::log::sinks::asynchronous_sink<boost::log::sinks::text_file_backend> file_sink; 
     boost::shared_ptr<file_sink> sink(new file_sink(backend)); 
     core->add_sink(sink); 
//============manually add end========================== 
     boost::log::add_common_attributes(); 
    } 

    thread_local Logger::logger_type Logger::gl(boost::log::keywords::channel = main_channel); 
    thread_local Logger::logger_type Logger::motion_checker(boost::log::keywords::channel = sub_channel); 

main.cpp

int main() 
{ 
    Logger::init(Logger::debug); 
    BOOST_LOG_SEV(Logger::gl, Logger::debug) << "ssss"; 
    { 
     BOOST_LOG_SCOPED_LOGGER_ATTR(Logger::motion_checker, "RoleName", boost::log::attributes::constant<std::string>("aaa")) 
     BOOST_LOG_SEV(Logger::motion_checker, Logger::debug) << "aaaa"; 
    } 
    system("pause"); 
    return 0; 
} 

Использование add_file_log, каждая вещь в порядке, но ручная добавка раковина потеряла все атрибуты, там только сообщение. И фильтр тоже не работает, сообщение sub_channel добавит в этот файл. Причина, по которой я создаю эту файловую раковину вручную, заключается в том, что add_file_log создает приемник синхронизации, я хочу асинхронный приемник.

+0

У вашего вопроса недостаточно подробностей, чтобы дать окончательный ответ. Я предполагаю, что вы забыли добавить те атрибуты, которые вы используете в фильтрах и форматировщиках. –

+0

Вставьте код здесь. Я использую add_common_attributes, добавляет attrs, но это не работает для ручного add sink – jean

ответ

1

Проблема заключается в том, что именованные параметры format и filter используются интерфейсом раковины, а не бэкэнд, и вы передаете их на бэкэнд. В результате не задаются ни фильтр, ни форматирование.

Я предлагаю вам переместить все именованные параметры в конструктор frontend frontend и передать его параметрам в backend-конструктор вместо того, чтобы самостоятельно создавать бэкэнд.

typedef boost::log::sinks::asynchronous_sink<boost::log::sinks::text_file_backend> file_sink; 
    boost::shared_ptr<file_sink> sink = boost::make_shared<file_sink>(
      boost::log::keywords::filter = channel == main_channel, 
      boost::log::keywords::file_name = "./log/%Y%m%d.log", 
      boost::log::keywords::auto_flush = true, 
      boost::log::keywords::open_mode = (std::ios::out | std::ios::app), 
      boost::log::keywords::time_based_rotation = boost::log::sinks::file::rotation_at_time_point(0, 0, 0), 
      boost::log::keywords::format = "[%TimeStamp%] (%LineID%) {%ThreadID%}: %Message%" 
    ); 
    core->add_sink(sink); 
+0

Это тоже не работает, фильтр и формат не работают. – jean

 Смежные вопросы

  • Нет связанных вопросов^_^