2016-09-13 1 views
0

Есть ли возможность в boost::log рассмотреть только часть сообщения журнала, если она слишком длинная (например, 1000 символов)? Это было бы полезно при отслеживании содержимого переменной, где ее полнота не обязательна для определения необходимой информации.Boost Log cut long log messages

Например: при печати строки со списком файлов из текущего каталога мне не нужно видеть весь список, чтобы узнать, была ли файловая система проверена успешно.

boost::log::add_file_log 
(
    boost::log::keywords::file_name = "logs/Log_%Y-%m-%d_%H-%M-%S.log", 
    boost::log::keywords::rotation_size = 10 * 1024 * 1024, 
    boost::log::keywords::time_based_rotation = boost::log::sinks::file::rotation_at_time_point(0, 0, 0), 
    boost::log::keywords::auto_flush = true, 
    boost::log::keywords::format = 
    (
     boost::log::expressions::stream 
     << boost::log::expressions::format_date_time<boost::posix_time::ptime>("TimeStamp", "%Y-%m-%d %H:%M:%S:%f") 
     << " [" << boost::log::expressions::attr<boost::log::attributes::current_thread_id::value_type>("ThreadID") << "]" 
     << ": <" << boost::log::trivial::severity << "> " 
     << boost::log::expressions::smessage 
    ) 
); 

т.д .: может boost::log::expressions::smessage быть настроены как boost::log::expressions::smessage::substr(0, 1000) или любым другим способом?

ответ

2

С Boost 1.62 есть декоратор max_size_decor, который делает то, что вы просите. Вы можете использовать его как это:

boost::log::add_file_log 
(
    boost::log::keywords::file_name = "logs/Log_%Y-%m-%d_%H-%M-%S.log", 
    boost::log::keywords::rotation_size = 10 * 1024 * 1024, 
    boost::log::keywords::time_based_rotation = boost::log::sinks::file::rotation_at_time_point(0, 0, 0), 
    boost::log::keywords::auto_flush = true, 
    boost::log::keywords::format = 
    (
     boost::log::expressions::stream 
     << boost::log::expressions::format_date_time<boost::posix_time::ptime>("TimeStamp", "%Y-%m-%d %H:%M:%S:%f") 
     << " [" << boost::log::expressions::attr<boost::log::attributes::current_thread_id::value_type>("ThreadID") << "]" 
     << ": <" << boost::log::trivial::severity << "> " 
     << boost::log::expressions::max_size_decor(1000) 
     [ 
      boost::log::expressions::stream << boost::log::expressions::smessage 
     ] 
    ) 
); 

Декоратор ограничивает выход принятого форматировщиком до указанного количества символов.

Вы также можете создать свой собственный форматировщик. Существует this ответ, описывающий несколько способов сделать это. Например, вы могли бы использовать boost::phoenix::bind, чтобы обернуть функцию, которая будет делать размер ограничивающим:

boost::string_view limit_size(boost::log::value_ref< 
    std::string, boost::log::expressions::tag::smessage > const& message) 
{ 
    if (!message) 
    { 
     // No message attribute in the log record 
     return boost::string_view(); 
    } 

    boost::string_view msg = message.get(); 
    return msg.substr(0, 1000); 
} 

boost::log::add_file_log 
(
    boost::log::keywords::file_name = "logs/Log_%Y-%m-%d_%H-%M-%S.log", 
    boost::log::keywords::rotation_size = 10 * 1024 * 1024, 
    boost::log::keywords::time_based_rotation = boost::log::sinks::file::rotation_at_time_point(0, 0, 0), 
    boost::log::keywords::auto_flush = true, 
    boost::log::keywords::format = 
    (
     boost::log::expressions::stream 
     << boost::log::expressions::format_date_time<boost::posix_time::ptime>("TimeStamp", "%Y-%m-%d %H:%M:%S:%f") 
     << " [" << boost::log::expressions::attr<boost::log::attributes::current_thread_id::value_type>("ThreadID") << "]" 
     << ": <" << boost::log::trivial::severity << "> " 
     << boost::phoenix::bind(&limit_size, boost::log::expressions::smessage.or_none()) 
    ) 
); 

В этом примере phoenix::bind создает функцию обертки объекта, который извлекает сообщение значения атрибут из журнала записи и передает его в свой limit_size функция, завернутая в value_ref эталонная обложка. Если запись журнала не содержит сообщения, эталонная оболочка пуста (это то, что делает or_none). Независимо от того, какие limit_size возвраты будут выведены в поток как часть процесса форматирования. В этом случае вы можете использовать boost::string_view или boost::string_ref, чтобы избежать копирования строки.