c++ - 如何为 boost 接收器(非全局)设置 open_mode 以附加

标签 c++ boost boost-log boost-logging

目前我正在使用接收器将数据写入日志文件和标准 otput。不幸的是,如果我重新启动我的应用程序,接收器将不会将新条目附加到日志文件中。它覆盖现有数据。我的代码如下:

using text_sink = boost::log::sinks::synchronous_sink<boost::log::sinks::text_ostream_backend>;

Logger::Logger(const LoggerConfig& config):mLoggerConfig(config){

    sink = boost::make_shared<text_sink>();

    if(config.isLogToFile()){
        //sink for output to file
        sink->locked_backend()->add_stream(
                    boost::make_shared<std::ofstream>(mLoggerConfig.getFileName().c_str()));
    }else{
        // create sink to stdout        
        sink->locked_backend()->add_stream(
                    boost::shared_ptr<std::ostream>(&std::cout, empty_delete()));
    }    

    sink->locked_backend()->auto_flush(true);     

    logging::formatter fmt = expr::stream
           << expr::attr< boost::posix_time::ptime >("timeStamp")
           << " " << severityAttr << ": "
           << expr::smessage;

    sink->set_formatter(fmt);

    // register sink
    logging::core::get()->add_sink(sink);

    //sink will only fetch output for this file
    sink->set_filter(expr::has_attr(tagAttr) && tagAttr == mLoggerConfig.getFileName());

    mLogger.add_attribute("fileName", attrs::constant<std::string>(mLoggerConfig.getFileName()));
    mLogger.add_attribute("timeStamp", attrs::local_clock());

}

我发现有 应设置为附加的关键字 open_mode:

boost::log::add_file_log
     (
         boost::log::keywords::file_name = "sample_%Y%m%d.log",
         boost::log::keywords::auto_flush = true,
         boost::log::keywords::open_mode = ( std::ios::out | std::ios::app), //....

但是有人知道如何在我的构造函数中为接收器设置这个关键字吗?因为我猜 add_file_log 会产生全局影响。

注意:我没有使用文件轮换。

最佳答案

But does anybody have an idea how to set this keyword just for the sink in my constructor?

不需要关键字,您可以将 std::ios_base::openmode 标志传递给 std::ofstream 构造函数。

//sink for output to file
sink->locked_backend()->add_stream(boost::make_shared<std::ofstream>(
    mLoggerConfig.getFileName().c_str(), std::ios::out | std::ios::app));

专业text_file_backend需要关键字,它自己管理文件流。

Because I guess add_file_log will have a global effect.

add_file_logconvenience function这只是简单地创建并向核心添加一个新的接收器。它使用 text_file_backend 来实现接收器。

关于c++ - 如何为 boost 接收器(非全局)设置 open_mode 以附加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34607462/

相关文章:

c++ - BOOST_LOG_SEV 在创建线程后破坏 async_read_some

c++ - aws-sdk-cpp 异常处理已禁用,使用 -fexceptions 启用

c++ - 代码:: block 丢失的关键字

c++ - 有人曾经将 boost::singleton 与 boost::logger 一起使用过吗?

android - Crystax NDK 链接器错误

c++ - ofstream(mode ios::out) 在系统停止时删除现有文件空白

c++ - 为什么 VC++ 允许 char 中有 2 个字符?

c++ - 在 CUDA 中循环遍历 3 维数组以求和它们的元素

android - Boost Log V2 库 Android 链接

c++ - boost::log-在库/插件中使用独立的严重级别