C++ Boost日志:文件旋转

C++ Boost日志:文件旋转,c++,boost,boost-log,C++,Boost,Boost Log,我对Boost日志文件循环有疑问。日志文件根据时间和文件大小进行旋转 旋转大小=30*1024*1024 基于时间的旋转=汇::文件::旋转在时间点(0,0,0) 当文件达到所述文件大小时,将创建另一个文件。假设文件在所述时间点之前旋转。我怀疑文件是否会在所述时间点旋转 我有一个问题: 已创建x1/mm/yy_N1的文件并达到文件大小,发生了下一次文件旋转(x1/mm/yy_N2)。在时间点(0,0,0),没有为x2/mm/yy_N3创建新文件,因此x2的日志被写入x1/mm/yy_N2。 我想

我对Boost日志文件循环有疑问。日志文件根据时间和文件大小进行旋转

旋转大小=30*1024*1024

基于时间的旋转=汇::文件::旋转在时间点(0,0,0)

当文件达到所述文件大小时,将创建另一个文件。假设文件在所述时间点之前旋转。我怀疑文件是否会在所述时间点旋转

我有一个问题:

已创建x1/mm/yy_N1的文件并达到文件大小,发生了下一次文件旋转(x1/mm/yy_N2)。在时间点(0,0,0),没有为x2/mm/yy_N3创建新文件,因此x2的日志被写入x1/mm/yy_N2。
我想在这两种情况下都得到旋转(大小和时间点)。帮助我。

如中所述,当满足一个或两个条件且库尝试写入日志记录时,将发生文件旋转。因此,如果您的日志文件在午夜前达到30 MiB,它将在该点旋转,然后在午夜(或午夜后,只要写入日志记录)再次旋转,而不管文件大小。

如中所述,当满足一个或两个条件且库尝试写入日志记录时,将发生文件旋转。因此,如果您的日志文件在午夜之前达到30 MiB,它将在该点旋转,然后在午夜(或午夜之后,只要写入日志记录)再次旋转,而不管文件大小。

日志将在两次出现时旋转。在这里检查

其他证明,请考虑下面的代码。

#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;
}

从以上文件的时间戳可以清楚地看出,文件旋转在这两个事件中都会发生

日志将在两次出现时旋转。在这里检查

其他证明,请考虑下面的代码。

#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;
}

从以上文件的时间戳可以清楚地看出,文件旋转在这两个事件中都会发生

谢谢你的信息和努力。我想知道,问题中提到的问题的原因是什么你能帮我解决吗你应该试着用小尺寸和小间隔来重现这个问题。您当前的设置似乎太大,其他人无法复制。您也可以尝试将文件大小设置得太大,并在不久的将来检查它在给定时间是否为logrotate。此外,还要确保您的测试程序正在编写要连续记录以进行测试的内容。我已经尝试了您提到的案例(工作正常)。应用程序运行在多线程环境中(问题很少发生),是否应该对同步部分执行任何操作。感谢提供的信息和您的努力。我想知道,问题中提到的问题的原因是什么你能帮我解决吗你应该试着用小尺寸和小间隔来重现这个问题。您当前的设置似乎太大,其他人无法复制。您也可以尝试将文件大小设置得太大,并在不久的将来检查它在给定时间是否为logrotate。此外,还要确保您的测试程序正在编写要连续记录以进行测试的内容。我已经尝试了您提到的案例(工作正常)。应用程序在多线程环境中运行(问题很少发生),是否应该对同步部分执行任何操作。第2天日志写入第1天日志文件的原因是什么。我不知道,您必须提供更多信息,例如复制程序代码示例,或者自己调试。作为一个可能的调查点,可能与重新启动进程时附加到上一个日志文件有关。第2天日志写入第1天日志文件的原因是什么。我不知道,您必须提供更多信息,例如复制程序代码示例,或者自己调试。作为一个可能的调查点,它可能与在重新启动进程时附加到上一个日志文件有关。