无法创建文件夹时忽略 Boost.Log 上的异常
Ignore exceptions on Boost.Log when unable to create folder
这是我必须维护的一段代码:
std::string log_file_name = "/tmp/log/program.log";
auto fs_sink = boost::log::add_file_log( boost::log::keywords::file_name = log_file_name, boost::log::keywords::open_mode = std::ios_base::app );
boost::log::add_common_attributes( );
fs_sink->locked_backend( )->auto_flush( true );
BOOST_LOG_TRIVIAL(info) << "Program Init...";
它工作正常,但是当程序无法创建/tmp/log/文件夹时(例如:已经有一个名为/tmp/log的文件),它会在[=21=中抛出异常]
Error - Terminating - Exception: boost::filesystem::create_directory: Not a directory: "/tmp/log"
terminate called after throwing an instance of 'boost::filesystem::filesystem_error'
what(): boost::filesystem::create_directory: Not a directory: "/tmp/log"
是否可以优雅地忽略这种情况而不抛出异常?
在与同事讨论后,他提出了这个可以说是优雅的解决方案。在第一 BOOST_LOG_TRIVIAL 行,我们检查异常,如果有问题,我们禁用文件后端以优雅地忽略未来的错误。
try
{
BOOST_LOG_TRIVIAL(info) << "Program Init...";
}
catch( ... )
{
// Disable file backend
boost::log::core::get( )->remove_all_sinks( );
}
执行此操作后,默认情况下所有日志都将转到标准输出。
您可以设置 exception handler on sink, core or logger 级别。当通过给定组件传播异常时将调用处理程序,特别是它可能会抑制异常的进一步传播。例如,要抑制核心级别的所有异常,可以这样设置:
boost::log::core::get()->set_exception_handler(boost::log::make_exception_suppressor());
这是我必须维护的一段代码:
std::string log_file_name = "/tmp/log/program.log";
auto fs_sink = boost::log::add_file_log( boost::log::keywords::file_name = log_file_name, boost::log::keywords::open_mode = std::ios_base::app );
boost::log::add_common_attributes( );
fs_sink->locked_backend( )->auto_flush( true );
BOOST_LOG_TRIVIAL(info) << "Program Init...";
它工作正常,但是当程序无法创建/tmp/log/文件夹时(例如:已经有一个名为/tmp/log的文件),它会在[=21=中抛出异常]
Error - Terminating - Exception: boost::filesystem::create_directory: Not a directory: "/tmp/log"
terminate called after throwing an instance of 'boost::filesystem::filesystem_error'
what(): boost::filesystem::create_directory: Not a directory: "/tmp/log"
是否可以优雅地忽略这种情况而不抛出异常?
在与同事讨论后,他提出了这个可以说是优雅的解决方案。在第一 BOOST_LOG_TRIVIAL 行,我们检查异常,如果有问题,我们禁用文件后端以优雅地忽略未来的错误。
try
{
BOOST_LOG_TRIVIAL(info) << "Program Init...";
}
catch( ... )
{
// Disable file backend
boost::log::core::get( )->remove_all_sinks( );
}
执行此操作后,默认情况下所有日志都将转到标准输出。
您可以设置 exception handler on sink, core or logger 级别。当通过给定组件传播异常时将调用处理程序,特别是它可能会抑制异常的进一步传播。例如,要抑制核心级别的所有异常,可以这样设置:
boost::log::core::get()->set_exception_handler(boost::log::make_exception_suppressor());