gpt4 book ai didi

c++ - boost::log 关闭日志文件并打开一个新的

转载 作者:搜寻专家 更新时间:2023-10-31 00:55:42 31 4
gpt4 key购买 nike

我正在使用 boost::log 同时记录到文件和控制台。它是这样初始化的:

void Init() {
logging::core::get()->set_filter
(
// set logging level to one of trace, debug, info, warning, error, fatal
logging::trivial::severity >= logging::trivial::trace
);
logging::add_common_attributes(); // enables timestamps and such
logging::add_file_log
(
keywords::file_name = logfile + "_%N.log",
keywords::rotation_size = 1024 * 1024 * 50, // 50MB log file max
// keywords::format = "[%TimeStamp%]: %Message%"
keywords::format = "%Message% #[%TimeStamp%]"
);

logging::add_console_log(std::cout,
keywords::format = "%Message%"
);
}

在我的程序中的某些点,我想手动更改日志文件。我可以更改上面代码中的“logfile”字符串并再次调用 Init(),但它会继续写入旧日志文件并启动新日志文件,并开始将控制台日志的输出加倍。

是否有某种相应的“remove_file_log”我丢失了,或者手动告诉它停止记录到原始日志并移动到下一个?

最佳答案

每次调用 add_file_log 都会在日志记录核心中注册一个新的文件接收器,这会导致同时写入多个文件。不会更换现有的水槽。根据您实际想做的事情,您可以做多种事情。

首先,如果您查看 add_file_log引用,您会注意到它返回指向创建的接收器的指针。您可以将该指针传递给 core::remove_sink当您希望停止使用该水槽时。被销毁后,接收器将关闭它正在使用的日志文件。

typedef sinks::synchronous_sink< sinks::text_file_backend > sink_t;
boost::shared_ptr< sink_t > g_file_sink;

void Init() {
// ...
g_file_sink = logging::add_file_log
(
keywords::file_name = logfile + "_%N.log",
keywords::rotation_size = 1024 * 1024 * 50, // 50MB log file max
keywords::format = "%Message% #[%TimeStamp%]"
);

// ...
}

void StopFileLogging() {
logging::core::get()->remove_sink(g_file_sink);
g_file_sink.reset();
}

二、text_file_backendadd_file_log 创建和返回的文件具有轮转日志文件的能力。如果您只想在程序的某些点切换日志文件,这可能就是您要找的。您可以将命名参数(例如 keywords::rotation_size)添加到 add_file_log 调用中,它们将用于在后端设置自动文件轮换。您也可以通过调用 text_file_backend::rotate_file 手动旋转文件在接收器后端。

void RotateLogFile() {
g_file_sink->locked_backend()->rotate_file();
}

请注意,在这种情况下,您不必从核心中移除水槽;它在文件旋转后保持事件状态。

关于c++ - boost::log 关闭日志文件并打开一个新的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41419957/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com