log4cplus使用DailyRollingFileAppender不在半夜0点切换文件的问题

来源:互联网 发布:怎样查看淘宝号等级 编辑:程序博客网 时间:2024/04/29 15:05

      由于新项目使用了log4cplus作为日志组件,但上生产后才发现配置了daily按天切换文件,实际切换文件都发生在早上8点钟,也就是每天都有0点到8点共8个小时的日志在以前一天命名的日志文件尾端,虽然说问题不大,但着实对日志监控及部分运维工作造成不必要的工作量,网上搜了下大多说的是使用了UTC时间之类的,本以为这bug官方会很快出修复版本,可惜一直等不到,只好自己调试改代码了,下面是改动的地方    

1.  将log4cplus源码目录里的src/fileappender.cxx文件的

namespace
{

static
Time
round_time (Time const & t, time_t seconds)
{
    return Time (
        t.getTime ()
        - static_cast<time_t>(std::fmod (
                static_cast<double>(t.getTime ()),
                static_cast<double>(seconds))));
}

static
Time
round_time_and_add (Time const & t, Time const & seconds)
{
    return round_time(t, seconds) + seconds;
}

} // namespace

改为

namespace
{

static
Time
round_time (Time const & t, time_t seconds)
{
    return Time (
        t.getTime ()
        - static_cast<time_t>(std::fmod (
                static_cast<double>(t.getTime ()),
                static_cast<double>(seconds))));
}

//Updated by cat 20170321

static
Time
round_time_fix(Time const & t)
{
    return Time(t.getTime());
}

static
Time
round_time_and_add (Time const & t, Time const & seconds)
{
    return round_time_fix(t) + seconds;
}

} // namespace

2. 如果想在启动时立即切换新文件,可在文件src/fileappender.cxx的方法void DailyRollingFileAppender::init(DailyRollingFileSchedule sch) (位置为紧挨着第1点修改的代码后面) 的最后面添加以下内容

//Added by cat 20170321
    rollover(true);

保存重新编译log4cplus即可。

注:本人使用的版本是log4cplus 1.2.0 版本,这个方法对所有平台(windows,linux,AIX)均有效,另,只对daily这一切换方式有详细测试过,其它切换方式请自行调试。


0 0
原创粉丝点击