Как установить open_mode для повышения приемника (не глобального) для добавления

В настоящее время я использую приемники для записи данных в файлы журналов и стандартного вывода. К сожалению, если я перезапущу свое приложение, приемник не добавит новые записи в файл журнала. Это переопределяет существующие данные. Мой код следующий:

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 будет иметь глобальный эффект.

Примечание: я не использую ротацию файлов.

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_log это функция удобства это просто создает и добавляет новую раковину в ядро. Он использует text_file_backend реализовать раковину.

1

Другие решения

Других решений пока нет …