无法创建文件夹时忽略 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());