您的位置:首页 > 移动开发

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

2017-07-05 19:42 381 查看
由于新项目使用了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这一切换方式有详细测试过,其它切换方式请自行调试。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  log4cplus