Logrotate缺失UTC 00:00-06:25日志问题求助
Logrotate管理Solr日志丢失UTC 00:00-06:25内容的排查与解决
我们在AWS EC2实例中使用logrotate工具管理Solr日志,当前的日志轮转脚本如下:
/opt/solr-6.5.0/server/logs/solr.log { daily rotate 1 missingok notifempty sharedscripts maxsize 500M copytruncate dateformat -%d %b %Y %H:%M:%S compress prerotate /usr/bin/find /opt/solr-6.5.0/server/logs/solr.log -mtime +0 -not -name '*.gz' 2>/dev/null -exec gzip {} \; || true /usr/bin/find /opt/solr-6.5.0/server/logs/solr.log -mtime +15 -delete 2>/dev/null || true endscript postrotate reload rsyslog >/dev/null 2>&1 || true endscript }
问题描述
日志文件中缺失UTC时间00:00:00至06:25:00的内容,当前日志文件起始时间为06:25 UTC,希望日志能从00:00 UTC开始记录。已尝试添加sharedscripts、调整maxsize至500M、设置dateformat,均未解决问题。
原因分析
- prerotate脚本逻辑错误:
find命令指定的路径是单个文件solr.log,无法匹配轮转后的带日期后缀的日志文件,导致旧日志处理不彻底,甚至可能丢失凌晨时段的日志。 - copytruncate的固有缺陷:该指令先复制日志文件再截断原文件,若复制与截断之间有日志写入,这部分日志会直接丢失,凌晨时段若有日志写入延迟,就会出现时间缺口。
- logrotate执行时间与UTC不匹配:logrotate默认随
cron.daily执行,若系统时区不是UTC,轮转触发时间会偏离UTC 00:00,导致凌晨的日志被留在旧文件中未被正确轮转。 - 无效的rsyslog重载:若Solr是直接写入日志文件而非通过rsyslog转发,
postrotate中的reload rsyslog操作毫无意义,甚至可能导致日志写入中断。
解决方案
1. 修复prerotate中的find命令
将find的目标路径改为日志目录,匹配所有solr相关日志文件:
prerotate /usr/bin/find /opt/solr-6.5.0/server/logs/ -name 'solr.log' -mtime +0 -not -name '*.gz' 2>/dev/null -exec gzip {} \; || true /usr/bin/find /opt/solr-6.5.0/server/logs/ -name 'solr.log*.gz' -mtime +15 -delete 2>/dev/null || true endscript
2. 确保logrotate在UTC 00:00触发
编辑/etc/crontab,将cron.daily的执行时间设为UTC 00:00(若系统默认时区不是UTC,需指定CRON_TZ):
# 在/etc/crontab中添加或修改 CRON_TZ=UTC 0 0 * * * root run-parts /etc/cron.daily
3. 替换copytruncate为create+重启Solr
避免copytruncate的丢失风险,改用create创建新日志文件,然后重启Solr切换日志输出:
/opt/solr-6.5.0/server/logs/solr.log { daily rotate 15 # 直接保留15天日志,无需prerotate删除逻辑 missingok notifempty sharedscripts maxsize 500M create 644 solr solr # 根据Solr运行的用户/组调整权限 dateformat -%Y%m%d-%H%M%S # 使用无空格的标准日期格式,避免文件路径问题 compress postrotate # 若Solr用systemd管理 systemctl restart solr || true # 若为脚本启动,替换为对应重启命令 # /opt/solr-6.5.0/bin/solr restart -p 8983 || true endscript }
4. 移除无效的rsyslog重载
若Solr直接写入日志文件,删除postrotate中的reload rsyslog行,避免不必要的干扰。
内容的提问来源于stack exchange,提问作者Shrottam Nayan
相关产品推荐
相关产品推荐

