本文目录导读:

在自动化脚本或配置管理(如 Ansible、Shell 脚本)中配置 Logrotate,通常有两种方式:
直接生成配置文件(推荐)
在脚本中调用 logrotate 命令
下面分别介绍这两种方式,并给出常见的配置模板。
通过脚本生成 Logrotate 配置文件
这是最规范的做法,Logrotate 的配置放在 /etc/logrotate.d/ 目录下,每个应用或服务一个配置文件。
Shell 脚本示例
假设你有一个应用日志路径为 /var/log/myapp/*.log,需要按天轮转,保留 7 天,并压缩。
#!/bin/bash
# 日志轮转配置文件路径
CONFIG_FILE="/etc/logrotate.d/myapp"
# 写入配置
cat > $CONFIG_FILE << 'EOF'
/var/log/myapp/*.log {
daily # 每天轮转一次
missingok # 如果日志不存在不报错
rotate 7 # 保留 7 个旧日志
compress # 压缩旧日志(默认 gzip)
delaycompress # 延迟压缩,最近一个轮转的不压,方便查看
notifempty # 日志为空则不轮转
create 0640 www-data adm # 创建新日志文件的权限、用户、组
sharedscripts # 多个日志文件匹配时,只执行一次 postrotate
postrotate
# 通知应用重新打开日志文件(以 Nginx 为例)
[ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
endscript
}
EOF
echo "Logrotate 配置已生成: $CONFIG_FILE"
关键点说明:
daily/weekly/monthly:轮转频率rotate N:保留旧日志个数compress / delaycompress:压缩设置create 权限 用户 组:轮转后新日志的文件权限postrotate ... endscript:轮转后执行的命令(如重载应用)sharedscripts:多个日志匹配时,postrotate只执行一次
在脚本中直接调用 logrotate
如果你不想生成配置文件,或者需要临时强制轮转,可以在脚本中使用 logrotate 命令。
#!/bin/bash
LOG_FILE="/var/log/myapp/access.log"
CONFIG_CONTENT=$(cat << 'EOF'
/var/log/myapp/access.log {
daily
rotate 3
compress
postrotate
# 某些应用需要信号来重新打开日志
systemctl reload nginx 2>/dev/null || true
endscript
}
EOF
)
# 方式 A: 使用临时文件
echo "$CONFIG_CONTENT" > /tmp/myapp_logrotate.conf
logrotate -f /tmp/myapp_logrotate.conf # -f 强制轮转
rm /tmp/myapp_logrotate.conf
# 方式 B: 使用管道(部分系统不支持)
# echo "$CONFIG_CONTENT" | logrotate -f -
注意:
-f:强制执行轮转(即使不满足条件也轮转)-v:详细输出,方便调试-s:指定状态文件(默认/var/lib/logrotate/logrotate.status)
常用 Logrotate 配置模板
通用应用日志(如 Java/Python 应用)
/var/log/myapp/*.log {
daily
rotate 30
compress
delaycompress
dateext # 日志文件名带日期
missingok
notifempty
create 0640 appuser appgroup
sharedscripts
postrotate
# 根据应用实际重载机制调整
supervisorctl signal HUP myapp 2>/dev/null || true
endscript
}
Nginx 日志
/var/log/nginx/*.log {
daily
rotate 14
compress
delaycompress
missingok
notifempty
create 0640 www-data adm
sharedscripts
postrotate
[ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
endscript
}
Docker 容器日志
/var/lib/docker/containers/*/*.log {
rotate 3
daily
compress
missingok
delaycompress
copytruncate # 拷贝并截断原日志,无需信号通知
notifempty
}
注意: copytruncate 可能会丢失少量日志行,但对 Docker 这种无法发送重载信号的场景很有效。
集成到 Ansible/Puppet/Salt 脚本
Ansible 示例
- name: 配置 logrotate for myapp
ansible.builtin.copy:
dest: /etc/logrotate.d/myapp
content: |
/var/log/myapp/*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 0640 www-data adm
postrotate
systemctl reload nginx || true
endscript
}
owner: root
group: root
mode: '0644'
验证配置是否生效
# 测试配置文件语法(不会实际轮转) logrotate -d /etc/logrotate.d/myapp # 强制运行一次轮转 logrotate -f /etc/logrotate.d/myapp # 查看当前状态 cat /var/lib/logrotate/logrotate.status | grep myapp
| 场景 | 推荐做法 |
|---|---|
| 新部署应用时 | 在安装脚本中生成 /etc/logrotate.d/ 配置文件 |
| 需要临时轮转 | 使用 logrotate -f 命令 |
| 配置管理工具 | 使用模板模块(Ansible copy/template) |
| Docker 容器日志 | 使用 copytruncate 模式 |
关键点:
- 配置文件放在
/etc/logrotate.d/,系统 cron 会自动执行。 - 主配置文件
/etc/logrotate.conf中include /etc/logrotate.d确保子配置生效。 postrotate中必须发送正确的信号或命令通知应用重载日志文件。