logrotate 日志切割简单配置
需求:把日志文件 /var/www/demo/app.log 按天切分。
- 创建 logrotate 配置文件:
vim /etc/logrotate.d/demo
demo 是你的配置文件名,可以随便起。
配置内容:
/var/www/demo/app.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
copytruncate
}
- 手动测试
logrotate -f /etc/logrotate.d/demo
如果出现以下报错:
error: skipping "/etc/logrotate.d/demo" because parent directory has insecure permissions (It's world writable or writable by group which is not "root") Set "su" directive in config file to tell logrotate which user/group should be used for rotation.
是因为 logrotate 检测到日志文件所在的上级目录权限不安全,所以拒绝轮转。Linux 上 logrotate 会很严格地检查目录权限,避免日志被恶意覆盖。报错里也给了提示:
Set "su" directive in config file to tell logrotate which user/group should be used for rotation.
- 日志文件所在目录是 777 或者 不是 root 拥有 的目录就会被判定为“insecure”。
- logrotate 默认是以 root 执行的,它要求目录安全,或者你要用 su 指定用户。
解决办法:
添加一个配置,指定以日志目录的拥有者执行 su 用户 组
我这里是 www www,所以添加 su www www
/var/www/demo/app.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
copytruncate
su www www
}
再次测试,执行成功。拆分出来的文件类似:
app.log.1
app.log.2
我希望以日期保存,添加配置:
/var/www/demo/app.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
copytruncate
su www www
dateext
dateformat -%Y%m%d
}
这样得到的就是:
app.log-20250911
如果希望保持后缀:
/var/www/demo/app.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
copytruncate
su www www
dateext
dateformat -%Y%m%d.log
}