ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Linux logrotate 使用教程

Linux logrotate 使用教程 Linux logrotate 使用教程一、简介logrotate是 Linux 自带日志轮转工具用来切割、压缩、删除旧日志防止日志文件无限增大。一般系统默认已经安装由cron定时触发。# 查看是否安装 logrotate --version二、核心配置文件主配置文件/etc/logrotate.conf全局默认规则子配置目录/etc/logrotate.d/各个应用单独放配置nginx、syslog 等三、常用配置参数写在配置文件里# 示例配置 /etc/logrotate.d/mylog /var/log/myapp/*.log { daily # 轮转周期daily每天, weekly每周, monthly每月 rotate 7 # 保留7个历史文件超过自动删除 size 10M # 当日志大于10M就触发轮转和周期二选一 minsize 5M # 不到5M不轮转 maxsize 20M # 最大20M强制切割 compress # 压缩旧日志默认gzip后缀 .gz nocompress # 不压缩 delaycompress # 延迟压缩下一次轮转才压缩上一轮日志部分程序需要 create 0644 root root # 轮转后新建日志权限、属主、属组 olddir /var/log/myapp/old # 旧日志放到这个目录必须同磁盘 notifempty # 日志为空时不轮转 missingok # 文件不存在不报错 copytruncate # 先复制日志然后清空原文件重点不重启应用 # postrotate 脚本轮转完成后执行 postrotate systemctl reload myapp /dev/null 21 endscript }✅copytruncate适合无法重新打开日志文件的程序Java 应用等原理 cptruncate。缺点复制瞬间可能丢失少量日志。 ❌ 不使用 copytruncate一般用create 发送信号让程序重新打开日志nginx、syslog 常用四、命令使用1. 手动测试推荐先测试不会实际轮转logrotate -d /etc/logrotate.d/mylog # -d debug只打印过程不执行2. 强制手动执行轮转不管周期直接执行logrotate -f /etc/logrotate.d/mylog3. 查看 logrotate 状态记录轮转记录保存在状态文件cat /var/lib/logrotate/status参数说明-vverbose打印详细执行过程-ddebug 调试-fforce 强制轮转-s指定状态文件五、执行时机默认系统自带 cron 任务RHEL/CentOS/etc/cron.daily/logrotate每天凌晨执行Debian/Ubuntu/etc/cron.daily/logrotate不是实时监控文件大小是 cron 定时跑 logrotate 脚本只有 cron 触发时才会检查 size 条件。 如果需要实时监控文件大小不能只用 logrotate要用 inotifywait。六、实战示例示例 1Java 应用日志copytruncate 模式新建文件/etc/logrotate.d/javaapp/opt/javaapp/logs/*.log { daily rotate 15 size 20M missingok notifempty compress copytruncate }测试logrotate -d /etc/logrotate.d/javaapp没问题再-f执行一次。示例 2Nginx 经典模式不用 copytruncatereopen 日志/var/log/nginx/*.log { daily rotate 14 missingok notifempty compress delaycompress create 0640 nginx nginx postrotate [ -f /run/nginx.pid ] kill -USR1 $(cat /run/nginx.pid) endscript }七、常见坑日志不轮转cron 是否正常运行systemctl status crond权限问题logrotate 以 root 执行status文件异常可删除/var/lib/logrotate/status重建copytruncate 丢日志复制文件过程中程序持续写日志少量日志不会被复制就被 truncate 清空。olddir 目录必须和原日志同一文件系统跨盘报错文件名带日期默认xxx.log.1如需带日期dateext参数dateext dateformat -%Y%m%d开启后日志变成xxx.log-20260929.gz八、dateext 补充/var/log/test.log { daily rotate 7 dateext dateformat -%Y%m%d missingok notifempty compress }生产通用 logrotate 模板两套直接复制使用适用SpringBoot/Java、Go、Node 等应用无需重启程序推荐copytruncate文件路径/etc/logrotate.d/applog# /etc/logrotate.d/applog # 应用日志路径按需修改 /opt/app/logs/*.log { # 按大小切割优先size同时带周期限制 size 20M daily # 最多保留15份历史日志 rotate 15 # 日志不足5M不切割 minsize 5M missingok notifempty # 开启日期后缀避免 log.1 log.2 覆盖混乱 dateext dateformat -%Y%m%d # gzip压缩旧日志 compress compresscmd /usr/bin/gzip uncompresscmd /usr/bin/gunzip compressext .gz # 核心复制后截断不重启应用 copytruncate # 权限按你的应用用户调整 create 0644 root root # 轮转完成后执行脚本不需要就删掉postrotate块 postrotate echo logrotate done for applog at $(date) /opt/app/logs/rotate.log endscript }Nginx / Apache 模板不使用 copytruncate信号重开日志性能更好文件路径/etc/logrotate.d/nginx/var/log/nginx/*.log { daily rotate 14 size 30M missingok notifempty dateext dateformat -%Y%m%d compress delaycompress create 0640 nginx nginx postrotate if [ -f /run/nginx.pid ]; then kill -USR1 $(cat /run/nginx.pid) fi endscript }部署操作步骤# 1. 创建配置文件粘贴模板 vim /etc/logrotate.d/applog # 2. 调试只打印不真实轮转重点看有没有error logrotate -d /etc/logrotate.d/applog # 3. 强制执行一次验证是否正常切割 logrotate -f /etc/logrotate.d/applog # 4. 查看轮转状态 cat /var/lib/logrotate/status可选增强systemd 定时器替代 cron适用于麒麟、CentOS Stream、Ubuntu1. 服务单元/etc/systemd/system/logrotate-custom.service[Unit] DescriptionCustom logrotate job Documentationman:logrotate(8) man:logrotate(5) [Service] Typeoneshot ExecStart/usr/sbin/logrotate /etc/logrotate.conf2. 定时器/etc/systemd/system/logrotate-custom.timer[Unit] DescriptionTimer for custom logrotate [Timer] # 每天凌晨02:00执行 OnCalendar*-*-* 02:00:00 Persistenttrue AccuracySec1min [Install] WantedBytimers.target# 启用定时器 systemctl daemon-reload systemctl enable --now logrotate-custom.timer # 查看定时器状态 systemctl list-timers logrotate-custom.timer生产避坑清单copytruncate文件很大时复制耗时短暂丢日志风险高吞吐日志不建议优先使用程序自带日志切割。dateext开启后rotate是按文件数量删除旧日期日志不会自动按时间清理。olddir 参数目标目录必须同磁盘跨分区直接报错。权限logrotate 默认 root 执行日志目录如果是应用单独用户create 属主要匹配。日志不切割logrotate 不是实时监控cron/systemd 定时才检查想实时监控文件大小用inotifywait。精简最小模板测试环境用/opt/app/logs/*.log { size 10M rotate 7 missingok notifempty compress copytruncate dateext }logrotate 按保留天数模板核心logrotate 本身只能按数量 rotate按天数清理需要搭配 postrotate 脚本适用Java/SpringBoot、Go 应用copytruncate保留 30 天日志过期自动删除 文件/etc/logrotate.d/applog-day/opt/app/logs/*.log { size 20M daily minsize 5M missingok notifempty dateext dateformat -%Y%m%d compress copytruncate create 0644 root root postrotate # 删除30天之前的日志文件 find /opt/app/logs -name *.log-*.gz -type f -mtime 30 -delete find /opt/app/logs -name *.log-* ! -name *.gz -type f -mtime 30 -delete endscript }关键点说明logrotate 的rotate N只能控制最多保留多少个轮转文件原生不支持 “保留 N 天”上面用find -mtime 30在每次轮转完成后清理超过 30 天的旧日志dateext 必须打开文件名带日期find 才能按文件修改时间筛选-mtime 30文件修改时间超过 30 整天才删除如需保留 29 天改成29。⚠️ 风险提示不要把原日志xxx.log被 find 误删匹配规则限定*.log-*轮转后的文件如果服务器时间回跳会导致文件 mtime 错乱误删 / 删不掉高吞吐日志copytruncate 有极小概率丢日志能改应用配置输出滚动日志优先用应用自身日志切割Nginx 版本按天数保留不用 copytruncate/var/log/nginx/*.log { daily size 30M missingok notifempty dateext dateformat -%Y%m%d compress delaycompress create 0640 nginx nginx postrotate if [ -f /run/nginx.pid ]; then kill -USR1 $(cat /run/nginx.pid) fi # 删除30天前日志 find /var/log/nginx -name *.log-*.gz -type f -mtime 30 -delete find /var/log/nginx -name *.log-* ! -name *.gz -type f -mtime 30 -delete endscript }操作命令# 调试 logrotate -d /etc/logrotate.d/applog-day # 强制执行 logrotate -f /etc/logrotate.d/applog-day进阶优化单独写 find 清理脚本推荐生产解耦新建脚本/opt/app/clean_old_log.sh#!/bin/bash LOG_DIR/opt/app/logs RETENTION_DAY30 find ${LOG_DIR} -name *.log-*.gz -type f -mtime ${RETENTION_DAY} -delete find ${LOG_DIR} -name *.log-* ! -name *.gz -type f -mtime ${RETENTION_DAY} -delete授权chmod x /opt/app/clean_old_log.sh配置文件里 postrotate 改成调用脚本postrotate /opt/app/clean_old_log.sh endscript备选方案atime访问时间一般不用-mtime修改时间推荐日志写入时间-atime访问时间-ctime文件属性变更时间额外只保留文件不压缩的模板/opt/app/logs/*.log { size 20M daily minsize 5M missingok notifempty dateext dateformat -%Y%m%d nocompress copytruncate create 0644 root root postrotate find /opt/app/logs -name *.log-* -type f -mtime 30 -delete endscript }
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进