Мне нужна помощь, чтобы инициализировать структуру журналирования наддува, чтобы одновременно регистрировать как именованный файл журнала, так и консоль (для именованного файла журнала не требуется периодическая ротация или какая-либо необычная настройка для многих из уроков наддува).
Текст журнала должен поступать в оба приемника (файл и консоль) одновременно, однако мне нужно отформатировать вывод консоли немного по-разному, так как он будет просматриваться пользователем. Я смог получить основы регистрации в 2 отдельных приемниках, работающих с использованием повысить пример кода. Это слишком сложно для того, что мне нужно сделать, и это действительно сбивает с толку, когда речь идет о доступе к соответствующему регистратору. Все, что мне нужно сделать, — это отправить сообщения с метками времени в файл журнала и получить ту же информацию без меток времени или перевода строк в журнал консоли (добавление новых строк явно, как это обычно делается с << потоковые операции std :: endl). Я действительно хотел бы придерживаться каркаса логирования boost, поскольку он дает гибкость для расширения в будущем.
В этом примере я попытался использовать tail -f для файлов журнала, однако вывод журнала не отображается автоматически после каждой записи журнала. Хотя это не очень важно для файловых журналов, это будет иметь решающее значение для потока вывода на консоль, поскольку он представляет активную активность, за которой будет следить пользователь.
Любая помощь или даже лучше, некоторые действительно простой пример кода, чтобы получить основы работы будет высоко ценится.
Как я настраиваю свою регистрацию (по ссылке выше), как показано ниже, я хотел бы заменить один из этих зарегистрированных приемников консольным регистратором — но я не уверен, как. Я ожидаю, что консольный логгер будет иметь автоматическую очистку.
// Setup the common formatter for all sinks
logging::formatter fmt = expr::stream
<< std::setw(6) << std::setfill('0') << line_id << std::setfill(' ')
<< ": <" << severity << ">\t"<< expr::if_(expr::has_attr(tag_attr))
[
expr::stream << "[" << tag_attr << "] "]
<< expr::smessage;
// Initialize sinks
typedef sinks::synchronous_sink<sinks::text_ostream_backend> text_sink;
boost::shared_ptr<text_sink> sink =
boost::make_shared<text_sink>();
sink->locked_backend()->add_stream(
boost::make_shared<std::ofstream>(
"full.log"));
sink->set_formatter(fmt);
// register the full log sink
logging::core::get()->add_sink(sink);
sink = boost::make_shared<text_sink>();
sink->locked_backend()->add_stream(
boost::make_shared<std::ofstream>(
"important.log"));
// sink->set_formatter(fmt); (I removed this to not have any special formatting hopefully)
sink->set_filter(severity >= warning ||
(expr::has_attr(tag_attr) &&
tag_attr == "IMPORTANT_MESSAGE"));
// register the important log sink
logging::core::get()->add_sink(sink);
// Add attributes
logging::add_common_attributes();
Вот пример кода, который использует глобальный регистратор Boost-Log. Я звоню init_term()
инициализировать мой терминал регистрации и init_logfile()
инициализировать мой лог-файл.
Обратите внимание auto_flush(true)
вызов
// Logging macro
#define LOG(level) BOOST_LOG_SEV(global_logger::get(), level)
// Initializing global boost::log logger
typedef boost::log::sources::severity_channel_logger_mt<
severity_level, std::string> global_logger_type;
BOOST_LOG_INLINE_GLOBAL_LOGGER_INIT(global_logger, global_logger_type)
{
return global_logger_type(boost::log::keywords::channel = "global_logger");
}
// Initialize terminal logger
void init_term()
{
// create sink to stdout
boost::shared_ptr<text_sink> sink = boost::make_shared<text_sink>();
sink->locked_backend()->add_stream(
boost::shared_ptr<std::ostream>(&out, boost::empty_deleter()));
// flush
sink->locked_backend()->auto_flush(true);
// format sink
sink->set_formatter
(
/// TODO add your desired formatting
);
// filter
// TODO add any filters
// register sink
bl::core::get()->add_sink(sink);
}
// Initialize logfile
void init_logfile(const std::string& logfilename)
{
// create sink to logfile
boost::shared_ptr<text_sink> sink = boost::make_shared<text_sink>();
sink->locked_backend()->add_stream(
boost::make_shared<std::ofstream>(logfilename.c_str()));
// flush
sink->locked_backend()->auto_flush(true);
// format sink
sink->set_formatter
(
/// TODO add your desired formatting
);
// filter
// TODO add any filters
// register sink
bl::core::get()->add_sink(sink);
}