Я использую объединенную регистрацию уровня серьезности и канала, чтобы получить какую-то область действия для выхода журнала.Установите как серьезность, так и канал для каждой записи
Проблема в том, что я хочу использовать один объект регистрации для всего проекта и, следовательно, хочу иметь возможность устанавливать канал для конкретной записи, и я не могу установить как серьезность, так и канал. Я могу установить либо или, но не оба.
Пример кода:
#include <iostream>
#include <boost/log/trivial.hpp>
#include <boost/log/sources/severity_channel_logger.hpp>
#include <boost/log/utility/manipulators/add_value.hpp>
#include <boost/log/utility/setup/common_attributes.hpp>
#include <boost/log/expressions.hpp>
#include <boost/log/sinks/sync_frontend.hpp>
#include <boost/log/sinks/text_ostream_backend.hpp>
#include <boost/log/support/date_time.hpp>
#include <boost/core/null_deleter.hpp>
namespace logging = boost::log;
using logger_type = logging::sources::severity_channel_logger_mt<logging::trivial::severity_level>;
int main()
{
logging::add_common_attributes();
using text_sink_type = logging::sinks::synchronous_sink<logging::sinks::text_ostream_backend>;
auto sink = boost::make_shared<text_sink_type>();
sink->locked_backend()->add_stream(boost::shared_ptr<std::ostream>(&std::clog, boost::null_deleter()));
sink->set_formatter(
logging::expressions::stream
<< logging::expressions::format_date_time<boost::posix_time::ptime>("TimeStamp", "%Y-%m-%d %H:%M:%S.%f") << " :: "
<< '[' << logging::trivial::severity << " - " << logging::expressions::attr<std::string>("Channel") << "] "
<< logging::expressions::smessage
);
logging::core::get()->add_sink(sink);
logger_type logger;
auto rec = logger.open_record(logging::keywords::severity = logging::trivial::info);
if (rec)
{
// This do not work
rec.attribute_values()["Channel"] = logging::attributes::make_attribute_value(std::string{"bar"});
logging::record_ostream ros{rec};
// This do not work either
ros << logging::add_value("Channel", std::string{"foo"});
ros << "Some message";
ros.flush();
logger.push_record(std::move(rec));
}
}
Приведенный выше код будет выводить
2016-09-27 10:25:38.941645 :: [info - ] Some message
Как видно, название канала не на выходе.
можно легко установить имя канала при открытии записи:
auto rec = logger.open_record(logging::keywords::channel = std::string{"channel"});
Но тогда я не в состоянии установить правильную тяжесть.
Есть ли способ установить как серьезность, так и канал для одной записи? Или мне нужно использовать несколько объектов журнала, по одному на канал?
Опционально я могу легко создавать новые объекты ведения журнала для каждого вывода, но это кажется чрезмерным даже для небольших объемов регистрации.