Журнал Boost: ротация файлов

У меня есть сомнения по поводу ротации файла журнала Boost. Ротация файла журнала происходит в зависимости от времени и размера файла.

rotation_size = 30 * 1024 * 1024

time_based_rotation = sins::file::rotation_at_time_point(0, 0, 0)

Когда файл достигает указанного размера, будет создан другой файл. Предположим, что файл будет повернут до указанного момента времени. Я сомневаюсь, что файл будет повернут в указанный момент времени или нет.

У меня проблема:

Файл для x1/мм/гг_N1 создан и достигает размера файла, произошло следующее вращение файла (x1/мм/гг_N2). Новый файл не создается для x2/mm/yy_N3 в момент времени (0,0,0), поэтому журналы для x2 записываются в x1/mm/yy_N2. Я хочу получить вращение при обоих условиях (размер, а также момент времени). Помоги мне.


person indev    schedule 27.11.2019    source источник


Ответы (2)


Как указано в docs, ротация файлов произойдет, когда один или оба критерия будут удовлетворены и библиотека попытается записать запись в журнал. Поэтому, если ваш файл журнала достигает 30 МБ до полуночи, он будет сменяться в этот момент, а затем снова в полночь (или после полуночи, как только запись журнала будет записана) независимо от размера файла.

person Andrey Semashev    schedule 28.11.2019
comment
По какой причине журналы дня2 записываются в файл журнала дня1. - person indev; 29.11.2019
comment
Я не знаю, вам придется предоставить дополнительную информацию, например, пример кода воспроизводящего устройства, или выполнить отладку самостоятельно. В качестве возможной точки расследования, возможно, это как-то связано с добавлением к предыдущему файлу журнала при перезапуске вашего процесса. - person Andrey Semashev; 30.11.2019

Журнал будет вращаться в обоих случаях. Проверьте код здесь.

Для другого доказательства рассмотрим приведенный ниже код.

#include <boost/log/trivial.hpp>
#include <boost/log/common.hpp>
#include <boost/log/keywords/file_name.hpp>
#include <boost/log/keywords/format.hpp>
#include <boost/log/utility/setup.hpp>

#include <thread>

namespace logging = boost::log;
namespace sinks = boost::log::sinks;
namespace src = boost::log::sources;
namespace expr = boost::log::expressions;
namespace attrs = boost::log::attributes;
namespace keywords = boost::log::keywords;

void init()
{
    logging::add_file_log
    (
        keywords::file_name = "sample_%N.log",                                        
        keywords::rotation_size = 256 * 1024,
        keywords::time_based_rotation = sinks::file::rotation_at_time_interval(boost::posix_time::seconds(30)), 
        keywords::format = "[%TimeStamp%]: %Message%"                                 
    );

    logging::core::get()->set_filter
    (
        logging::trivial::severity >= logging::trivial::info
    );
}

int main(int, char*[])
{
    init();

    while(1) {
    BOOST_LOG_TRIVIAL(trace) << "A trace severity message";
    BOOST_LOG_TRIVIAL(debug) << "A debug severity message";
    BOOST_LOG_TRIVIAL(info) << "An informational severity message";
    BOOST_LOG_TRIVIAL(warning) << "A warning severity message";
    BOOST_LOG_TRIVIAL(error) << "An error severity message";
    BOOST_LOG_TRIVIAL(fatal) << "A fatal severity message";
    std::this_thread::sleep_for(std::chrono::milliseconds(10));
}

    return 0;
}

Теперь просмотрите список файлов журнала с отметкой времени.

-rw-r--r-- 1 manthan manthan 256K 2019-11-28 12:52:01.451001000 +0530 sample_12.log
-rw-r--r-- 1 manthan manthan  58K 2019-11-28 12:51:35.003001000 +0530 sample_11.log
-rw-r--r-- 1 manthan manthan 256K 2019-11-28 12:51:29.363001000 +0530 sample_10.log
-rw-r--r-- 1 manthan manthan  49K 2019-11-28 12:51:05.011001000 +0530 sample_9.log
-rw-r--r-- 1 manthan manthan 256K 2019-11-28 12:51:00.563001000 +0530 sample_8.log
-rw-r--r-- 1 manthan manthan 248K 2019-11-28 12:50:35.007001000 +0530 sample_7.log
-rw-r--r-- 1 manthan manthan 5.0K 2019-11-28 12:50:05.003001000 +0530 sample_6.log
-rw-r--r-- 1 manthan manthan 256K 2019-11-28 12:50:04.347001000 +0530 sample_5.log
-rw-r--r-- 1 manthan manthan  36K 2019-11-28 12:49:35.007001000 +0530 sample_4.log
-rw-r--r-- 1 manthan manthan 256K 2019-11-28 12:49:31.211001000 +0530 sample_3.log
-rw-r--r-- 1 manthan manthan 244K 2019-11-28 12:49:05.003001000 +0530 sample_2.log
-rw-r--r-- 1 manthan manthan  19K 2019-11-28 12:48:35.003001000 +0530 sample_1.log
-rw-r--r-- 1 manthan manthan 256K 2019-11-28 12:48:32.875001000 +0530 sample_0.log

Из временной метки файлов выше видно, что ротация файлов происходит в обоих случаях.

person Manthan Tilva    schedule 28.11.2019
comment
Спасибо за информацию и ваши усилия. Я хочу знать, в чем будет причина проблемы, о которой я упоминал в вопросе... можете ли вы мне помочь? - person indev; 28.11.2019
comment
Вы должны попробовать с небольшим размером и небольшим интервалом, чтобы воспроизвести проблему. Текущие настройки кажутся слишком большими, чтобы кто-то мог их воспроизвести. - person Manthan Tilva; 28.11.2019
comment
Вы также можете попробовать установить слишком большой размер файла и время в ближайшее время, чтобы проверить, является ли он logrotate в данный момент времени или нет. - person Manthan Tilva; 28.11.2019
comment
А также убедитесь, что ваша тестовая программа постоянно записывает что-то в журнал для тестирования. - person Manthan Tilva; 28.11.2019
comment
Я пробовал с упомянутыми вами случаями (отлично работает). Приложение работает в многопоточной среде (проблема возникает редко), нужно ли выполнять какие-либо действия в синхронной части. - person indev; 28.11.2019
comment
Я так не думаю. Есть ли вероятность того, что в указанное время ваше приложение может не работать ИЛИ оно выйдет из строя? - person Manthan Tilva; 28.11.2019
comment
Да, приложение зависло. - person indev; 28.11.2019
comment
Тогда это проблема. Когда приложение не запущено, как оно может вращать файл журнала. Так что это не проблема, связанная с boost.log - person Manthan Tilva; 28.11.2019
comment
Затем, как журналы на следующий день были записаны в файл журнала предыдущего дня. - person indev; 28.11.2019