С 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
, чтобы избежать копирования строки.