如何设置要添加的boost sink(非全局)的open_mode

时间:2016-01-05 08:46:57

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

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

$http

我发现有 关键字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), //.... 会产生全局影响。

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

1 个答案:

答案 0 :(得分:2)

  

但有人知道如何在我的构造函数中为接收器设置此关键字吗?

不需要关键字,您可以将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需要关键字,它自己管理文件流。

  

因为我猜add_file_log会产生全局影响。

add_file_logconvenience function,它只是创建并向核心添加新的接收器。它使用text_file_backend来实现接收器。