如何设置 open_mode 以附加提升接收器(非全局)
How to set open_mode for a boost sink (non global) to append
目前我正在使用接收器将数据写入日志文件和标准 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_log
是一个 convenience function,它只是创建一个新的接收器并将其添加到核心。它使用 text_file_backend
来实现接收器。
目前我正在使用接收器将数据写入日志文件和标准 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_log
是一个 convenience function,它只是创建一个新的接收器并将其添加到核心。它使用 text_file_backend
来实现接收器。