需求:把日志文件 /var/www/demo/app.log 按天切分。

  1. 创建 logrotate 配置文件:
vim /etc/logrotate.d/demo

demo 是你的配置文件名,可以随便起。

配置内容:

/var/www/demo/app.log {
    daily
    missingok
    rotate 7
    compress
    delaycompress
    notifempty
    copytruncate
}
  1. 手动测试
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
}

标签: logrotate, 日志

添加新评论