Как сохранить самое последнее имя файла журнала в первом индексе (например, logtrail01.txt) с помощью библиотеки журналов Boost V2 1.70? - PullRequest
0 голосов
/ 24 апреля 2019

Я представляю замену встроенному каркасу ведения журнала моего приложения.Существующее ведение журнала записывается таким образом, чтобы генерировать файлы таким образом, что файл, в который в данный момент записывается файл, имеет имя "logs.txt" , а пролонгированные файлы называются "Logs.N.txt" , где "Logs.1.txt" является последним после "журналов..txt ".Как мне добиться такого же поведения при ведении журнала Boost V2?

Попытка использовать ведение журнала Boost, поскольку оно обеспечивает хорошую поддержку нескольких приемников, поскольку теперь я должен нацелить свои журналы на 3 местоположения: a) локальный файл журнала, b) драйвер стека в облаке и c) сервер системного журнала, размещенный в отдельном контейнере

Причина, по которой я хочу текущий файлбыть "logs.txt" означает, что, помимо прочего, он позволяет просто tail -F logs.txt в работающей системе.

Я нашел фрагмент, который вращает журналы и поддерживает ограничения по размеру для каждого файла и всего журнала.

auto strm = boost::log::add_file_log(
        boost::log::keywords::file_name = "Logs.%2N.txt",
        boost::log::keywords::open_mode = std::ios_base::app,
        boost::log::keywords::rotation_size = 5 * 1024, // Max filesize
        boost::log::keywords::auto_flush = true
    );

auto bkend = strm->locked_backend();                                                       
bkend->set_file_collector(boost::log::sinks::file::make_collector(                      
            boost::log::keywords::target = "./", // log file destination
            boost::log::keywords::max_size = 100 * 1024, //Max total size
            boost::log::keywords::min_free_space = 100000
            ));

bkend->scan_for_files(boost::log::sinks::file::scan_method::scan_matching, true);       

Поведение

Текущий шаблон генерации файла:

Logs.01.txt     <--- Oldest file
Logs.02.txt
.
.
.
Logs.19.txt
Logs.20.txt     <--- File being written to

, который при продолжении ведения журнала станет

Logs.41.txt     <--- Oldest file
Logs.42.txt
.
.
.
Logs.59.txt
Logs.60.txt     <--- File being written to

Индекс простопродолжает катиться (так что он выходит за пределы желаемого двузначного индекса)

Logs.131.txt     <--- Oldest file
Logs.132.txt
.
.
.
Logs.149.txt
Logs.150.txt     <--- File being written to

Требуемый шаблон генерации файла:

logs.txt        <--- File being written to
Logs.01.txt     <--- Latest rolled over file
Logs.02.txt
.
.
.
Logs.12.txt
Logs.13.txt     <--- Oldest file

увеличивается до

logs.txt        <--- File being written to
Logs.01.txt     <--- Latest rolled over file
Logs.02.txt
.
.
.
Logs.19.txt
Logs.20.txt     <--- Oldest file

& asLogs.20.txt находится на пределе общего пространства, он продолжает перезаписывать файл Logs.20.txt с помощью Logs.19.txt и т. Д. Для каждого ролловера.

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

Вопросы

  1. Существует ли конфигурация для бэкэнда ведения журнала файлов, которая может его поддерживать?
  2. Еслинет, как я могу настроить бэкэнд для этого?
  3. Кроме того, пожалуйста, укажите мне на любую документацию / учебное пособие (кроме документации Boost.Log) , чтобы повысить логирование, которое говорит о структуре библиотекии взаимодействие на уровне класса, если известно.

1 Ответ

0 голосов
/ 25 апреля 2019

Существует ли конфигурация для бэкэнда регистрации файлов, которая может его поддерживать?

Нет, Boost.Log не поддерживает это. Основная причина заключается в том, что для сохранения самого последнего файла журнала значение счетчика 0 требует, чтобы N файлов переименовывалось при каждом обороте, где N - число ранее повернутых файлов. Помимо влияния на производительность, это увеличивает вероятность сбоя во время операций файловой системы (например, если процесс открывает один из файлов во время ротации, что приведет к ошибке переименования в Windows).

Если нет, то как мне настроить бэкэнд для этого?

Вам не нужно настраивать серверную часть приемника, но вам придется написать собственный сборщик файлов. Вы должны реализовать интерфейс collector, наиболее важно метод store_file, который должен выполнять все действия файловой системы, включая переименование файлов и удаление старых файлов. Этот метод будет вызываться, когда бэкэнд приемника вращает файл журнала. Вы можете настроить сборщик файлов, позвонив по номеру set_file_collector на серверной стороне приемника.

...