Мне нужна помощь, чтобы инициализировать инфраструктуру ведения журнала повышения для одновременного ведения журнала как в именованный файл журнала, так и в консоль - (именованный файл журнала не требует периодической ротации или какой-либо из этих причудливых настроек для многих учебников по повышению).
Текст журнала должен отправляться в оба приемника одновременно, однако мне нужно немного по-другому отформатировать вывод консоли (так как он будет просматриваться пользователем). Я смог получить основы ведения журнала для двух отдельных приемников, работающих с помощью пример кода повышения. Это слишком сложно для того, что мне нужно сделать, и это действительно сбивает с толку, когда речь идет о доступе к соответствующему регистратору. Все, что мне нужно сделать, это иметь сообщения с отметками времени, отправляемые в файл журнала, и иметь ту же информацию без отметок времени или новых строк, отправляемых в журнал консоли (явно добавляя новые строки только так, как я обычно делаю с << 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();