2017-01-01 3 views
0

Я использую boost :: log для одновременного входа в файл, а также в консоль. Он инициализирован так:boost :: log закрыть файл журнала и открыть новый

void Init() { 
logging::core::get()->set_filter 
    (
     // set logging level to one of trace, debug, info, warning, error, fatal 
     logging::trivial::severity >= logging::trivial::trace 
    ); 
logging::add_common_attributes(); // enables timestamps and such 
logging::add_file_log 
    (
     keywords::file_name  = logfile + "_%N.log", 
     keywords::rotation_size = 1024 * 1024 * 50, // 50MB log file max 
     //  keywords::format = "[%TimeStamp%]: %Message%" 
     keywords::format  = "%Message% #[%TimeStamp%]" 
    ); 

logging::add_console_log(std::cout, 
         keywords::format = "%Message%" 
); 
} 

В некоторых случаях в моей программе я хотел бы вручную изменить файл журнала. Я могу изменить строку «logfile» в приведенном выше коде и снова вызвать этот Init(), но затем он продолжает записывать в старый файл журнала и запускает новый, и начинает удваивать вывод в журнале консоли.

Есть ли какой-либо соответствующий «remove_file_log», который мне не хватает, или вручную сообщите ему, чтобы остановить запись в исходный журнал и перейти к следующему?

ответ

1

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

Во-первых, если вы посмотрите на ссылку add_file_log, вы заметите, что она возвращает указатель на созданную раковину. Вы можете передать этот указатель на core::remove_sink, если вы хотите, чтобы этот приемник не использовался. После его уничтожения приемник закроет файл журнала, который он использовал.

typedef sinks::synchronous_sink<sinks::text_file_backend> sink_t; 
boost::shared_ptr<sink_t> g_file_sink; 

void Init() { 
    // ... 
    g_file_sink = logging::add_file_log 
    (
     keywords::file_name  = logfile + "_%N.log", 
     keywords::rotation_size = 1024 * 1024 * 50, // 50MB log file max 
     keywords::format  = "%Message% #[%TimeStamp%]" 
    ); 

    // ... 
} 

void StopFileLogging() { 
    logging::core::get()->remove_sink(g_file_sink); 
    g_file_sink.reset(); 
} 

Во-вторых, text_file_backend, который создан и возвращен add_file_log имеет возможность поворачивать файлы журналов. Если вы просто хотите переключить файл журнала в определенных точках программы, это то, что вы, вероятно, ищете. Вы можете добавить именованные параметры, такие как keywords::rotation_size, к вызову add_file_log, и они будут использоваться для настройки автоматического поворота файла в бэкэнд. Вы также можете повернуть файл вручную, вызвав text_file_backend::rotate_file на бэкэнде раковины.

void RotateLogFile() { 
    g_file_sink->locked_backend()->rotate_file(); 
} 

Обратите внимание, что в этом случае вам не нужно удалять раковину из сердечника; он остается активным после того, как файл был повернут.

Смежные вопросы