Boost::Log и нумерация журналов

Недавно я попытался добавить ведение журнала через журнал Boost в небольшое приложение. Однако, используя ротацию журналов, я по какой-то причине не могу заставить его подобрать правильный счетчик в каталоге журналов.

Например, если мой каталог Logs содержит файлы Log_000.log и Log_001.log, я ожидаю, что ведение журнала начнется с Log_002.log, но оно всегда начинается снова с 0.

Я, вероятно, что-то упускаю, но если кто-то может найти что-то, я был бы благодарен. Вот мой код запуска:

void initLogging()
{
    boost::log::add_common_attributes();
    auto core = boost::log::core::get();

    core->add_global_attribute("UTCTimeStamp",boost::log::attributes::utc_clock());

    auto x = boost::log::add_file_log(
        boost::log::keywords::file_name             = "Log_%3N.log",
        boost::log::keywords::rotation_size         = 2 * 1024, // 2k
        boost::log::keywords::target                = "Logs",
        boost::log::keywords::min_free_space        = 30 * 1024 * 1024,
        boost::log::keywords::max_size              = 20 * 1024, // 20k
        boost::log::keywords::time_based_rotation   = boost::log::sinks::file::rotation_at_time_point(boost::gregorian::greg_day(31)),
        boost::log::keywords::scan_method           = boost::log::sinks::file::scan_matching,
        boost::log::keywords::format                = "%UTCTimeStamp% (%TimeStamp%) [%ThreadID%]: %Message%",
        boost::log::keywords::auto_flush            = true
        );

    auto d = x->locked_backend()->scan_for_files();
}

Большое спасибо


person Dave F    schedule 17.07.2015    source источник
comment
Я никогда не использовал эту библиотеку, поэтому не могу быть уверен, что это правильно, но, глядя на файл документация заставляет меня думать, что вам нужно добавить что-то вроде x->locked_backend()->set_file_collector(boost::log::sinks::file::make_collector(boost::log::keywords::target = "Logs")); перед вызовом scan_for_files.   -  person llonesmiz    schedule 17.07.2015
comment
Я пробовал это сегодня в отчаянии, но это дает мне тот же результат :( Должно быть, что-то упущено   -  person Dave F    schedule 17.07.2015


Ответы (1)


Ага! Похоже, если вы используете помощник add_file_log, он автоматически вызывает scan_for_files.

Повторный вызов приводит к сбросу счетчика, поэтому я просто удалил вызов scan_for_files.

Просто вставил это как ответ на случай, если это сведет кого-то еще с ума!

Вот рабочий образец

Жить на Coliru

Вы увидите, что после 10 запусков Logs/ содержит:

-rw-r--r-- 1 2001 2000 998 Jul 17 16:26 Log_080.log
-rw-r--r-- 1 2001 2000 998 Jul 17 16:26 Log_081.log
-rw-r--r-- 1 2001 2000 998 Jul 17 16:26 Log_082.log
-rw-r--r-- 1 2001 2000 998 Jul 17 16:26 Log_083.log
-rw-r--r-- 1 2001 2000 998 Jul 17 16:26 Log_084.log
-rw-r--r-- 1 2001 2000 998 Jul 17 16:26 Log_085.log
-rw-r--r-- 1 2001 2000 998 Jul 17 16:26 Log_086.log
-rw-r--r-- 1 2001 2000 998 Jul 17 16:26 Log_087.log
-rw-r--r-- 1 2001 2000 998 Jul 17 16:26 Log_088.log
-rw-r--r-- 1 2001 2000 998 Jul 17 16:26 Log_089.log
-rw-r--r-- 1 2001 2000 998 Jul 17 16:26 Log_090.log
-rw-r--r-- 1 2001 2000 998 Jul 17 16:26 Log_091.log
-rw-r--r-- 1 2001 2000 998 Jul 17 16:26 Log_092.log
-rw-r--r-- 1 2001 2000 998 Jul 17 16:26 Log_093.log
-rw-r--r-- 1 2001 2000 998 Jul 17 16:26 Log_094.log
-rw-r--r-- 1 2001 2000 998 Jul 17 16:26 Log_095.log
-rw-r--r-- 1 2001 2000 998 Jul 17 16:26 Log_096.log
-rw-r--r-- 1 2001 2000 998 Jul 17 16:26 Log_097.log
-rw-r--r-- 1 2001 2000 998 Jul 17 16:26 Log_098.log
-rw-r--r-- 1 2001 2000 998 Jul 17 16:26 Log_099.log

Список кодов

#define BOOST_LOG_DYN_LINK 1
#include <boost/log/core.hpp>
#include <boost/log/common.hpp>
#include <boost/log/attributes.hpp>
#include <boost/log/sinks.hpp>
#include <boost/log/expressions.hpp>
#include <boost/log/trivial.hpp>
#include <boost/log/utility/setup/common_attributes.hpp>
#include <boost/log/utility/setup/file.hpp>
#include <string>

void initLogging()
{
    boost::log::add_common_attributes();
    auto core = boost::log::core::get();

    core->add_global_attribute("UTCTimeStamp",boost::log::attributes::utc_clock());

    auto x = boost::log::add_file_log(
            boost::log::keywords::file_name             = "Log_%3N.log",
            boost::log::keywords::rotation_size         = 1 * 1024, // 1k
            boost::log::keywords::target                = "Logs",
            boost::log::keywords::min_free_space        = 30 * 1024 * 1024,
            boost::log::keywords::max_size              = 20 * 1024,
            boost::log::keywords::time_based_rotation   = boost::log::sinks::file::rotation_at_time_point(boost::gregorian::greg_day(31)),
            boost::log::keywords::scan_method           = boost::log::sinks::file::scan_matching,
            boost::log::keywords::format                = "%UTCTimeStamp% (%TimeStamp%) [%ThreadID%]: %Message%",
            boost::log::keywords::auto_flush            = true
        );

    //auto d = x->locked_backend()->scan_for_files();
}

int main()
{
    initLogging();
    for (int i = 0; i < 20; ++i) {
        BOOST_LOG_TRIVIAL(trace) << "Let's go shopping " << std::string(400, '*');
    }
}
person Dave F    schedule 17.07.2015
comment
Ух ты. Это очень полезно. Не возражаете, если я сделаю образец автономным? - person sehe; 17.07.2015
comment
М-м-м. Не вижу улучшений: coliru.stacked-crooked.com/a/1abcce12f115d60b (все еще показывает, начиная с 000 снова и заканчивая 00000) - person sehe; 17.07.2015
comment
Хм. Я заметил, что у вас есть scan_all, а не scan_matching - возможно ли это? - person Dave F; 17.07.2015
comment
Да! Это исправлено. Обновление вашего поста - person sehe; 17.07.2015