通过logrotate和cronolog对日志进行切割
我的进程启动system文件
[Unit]
Description=TestDaemon
After=network-online.target
Requires=network-online.target[Service]
User=admin
Group=admin
Environment=GOLOG_LOG_FMT=nocolor
Environment=GOLOG_LOG_LEVEL=info
Environment=GOLOG_FILE=/data/test/test.log
Environment=TEST_LOG_LEVEL_NAMED=vm:error,badgerbs:info,sub:errorEnvironment=TEST_REPO=/data/test
Environment=TEST_CONFIG=/etc/test/config.toml# 256G
Environment=TEST_BLOCKSTORE_CACHE_SIZE=5000000
Environment=TEST_STATESTORE_CACHE_SIZE=3000000Environment=LOTUS_VM_ENABLE_TRACING=1
#Environment=TEST_HAMT_PARALLEL_WORKER_LIMIT=16
#Environment=TEST_AMT_PARALLEL_WORKER_LIMIT=16ExecStart=/usr/local/bin/test daemon#ExecStartPost=/usr/local/bin/start-lily-worker.shExecStartPost=/usr/local/bin/job.sh watchRestart=always
RestartSec=10
TimeoutSec=0
TimeoutStartSec=0[Install]
WantedBy=multi-user.target
编写文件/etc/logrotate.d/test
/data/test/test.log {daily # 每天分割一次rotate 14 # 保留 14 天的日志compress # 压缩旧日志,节省空间missingok # 如果文件不存在也不报错notifempty # 空文件不处理create 644 admin admin # 新日志文件权限和属主postrotatesystemctl kill -s HUP test.serviceendscript
}
注
daily:每天轮转
weekly:每周轮转
monthly:每月轮转
测试
logrotate -f /etc/logrotate.d/test
查询新生成的日志
# ls -lh /data/test/test.log*
-rw-r--r-- 1 admin admin 841K Apr 29 04:30 /data/test/test.log
-rw-r--r-- 1 admin admin 1.9M Apr 29 04:17 /data/test/test.log.1.gz
改成每三天一次
prerotate 中的 [ ( ( (( (((date +%s) / 86400 % 3)) -eq 0 ] || exit 1:意思是只有每3天(从Unix纪元以来的天数 mod 3 == 0)才轮转,否则提前退出(不执行日志切割)
/data/test/test.log {missingoknotifemptycompressdelaycompressrotate 14create 644 admin adminsu admin admindateextdateformat -%Y%m%dprerotate[ $(($(date +%s) / 86400 % 3)) -eq 0 ] || exit 1endscriptpostrotatesystemctl restart test.serviceendscript
}
将 logrotate 配置放进一个 cron 任务,每3天执行
创建一个 cron 文件:
sudo crontab -e
# 添加内容如下(每3天凌晨2点执行):
0 2 */3 * * /usr/sbin/logrotate -f /etc/logrotate.d/test
注
你的 test 进程需要支持 收到 HUP 信号时重新打开日志文件。
如果 test不支持 HUP 信号 reopen,可以稍微改成用 systemctl restart test.service(但这会重启进程)。
如果你想更精细,比如每小时分一次,可以用 logrotate 的 hourly,但需要额外设置计划任务。
ExecStart=/usr/local/bin/test daemon | /usr/bin/cronolog /data/test/test-%Y-%m-%d.log
这样的话,每天生成一个新文件,比如:
/data/test/test-2025-04-29.log
/data/test/test-2025-04-30.log
不过这种方法会让你的 systemd 不直接管理 test的日志(因为日志被 cronolog 接走了),出错排查稍微麻烦
方法 | 特点 | 适合情况 |
---|---|---|
logrotate | 正统、稳定、方便管理 | 建议优先使用 |
cronolog 管道方式 | 实时按时间分 | 对日志要求实时分割的情况 |