Skip to content

日志轮转

日志轮转可以防止日志文件过大,方便日志管理。

基本配置

使用logrotate

bash
sudo vi /etc/logrotate.d/nginx

添加以下内容:

/var/log/nginx/*.log {
    daily
    missingok
    rotate 14
    compress
    delaycompress
    notifempty
    create 0640 www-data adm
    sharedscripts
    postrotate
        [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
    endscript
}

参数说明

daily

  • 每天轮转日志

missingok

  • 如果日志文件不存在,不报错

rotate 14

  • 保留14天的日志

compress

  • 压缩旧日志

delaycompress

  • 延迟压缩,保留最近一个未压缩的日志

notifempty

  • 如果日志文件为空,不轮转

create 0640 www-data adm

  • 创建新日志文件,权限0640,所有者www-data,组adm

sharedscripts

  • 所有日志共享postrotate脚本

postrotate

  • 轮转后执行的脚本

完整配置

生产环境配置

bash
sudo vi /etc/logrotate.d/nginx

添加以下内容:

/var/log/nginx/*.log {
    daily
    missingok
    rotate 14
    compress
    delaycompress
    notifempty
    create 0640 www-data adm
    sharedscripts
    postrotate
        [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
    endscript
}

手动轮转

测试轮转

bash
sudo logrotate -d /etc/logrotate.d/nginx

强制轮转

bash
sudo logrotate -f /etc/logrotate.d/nginx

自定义轮转策略

按大小轮转

bash
/var/log/nginx/*.log {
    size 100M
    rotate 14
    compress
    delaycompress
    notifempty
    create 0640 www-data adm
    sharedscripts
    postrotate
        [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
    endscript
}

按周轮转

bash
/var/log/nginx/*.log {
    weekly
    rotate 4
    compress
    delaycompress
    notifempty
    create 0640 www-data adm
    sharedscripts
    postrotate
        [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
    endscript
}

按月轮转

bash
/var/log/nginx/*.log {
    monthly
    rotate 12
    compress
    delaycompress
    notifempty
    create 0640 www-data adm
    sharedscripts
    postrotate
        [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
    endscript
}

日志清理

清理旧日志

bash
find /var/log/nginx -name "*.gz" -mtime +30 -delete

清理所有旧日志

bash
find /var/log/nginx -name "*.gz" -delete

常见问题

日志未轮转

原因: logrotate配置错误

解决: 检查logrotate配置

bash
sudo logrotate -d /etc/logrotate.d/nginx

日志未压缩

原因: compress未启用

解决: 启用compress

bash
/var/log/nginx/*.log {
    compress
    ...
}

总结

日志轮转的关键点:

  • logrotate:使用logrotate工具
  • 轮转策略:按时间或大小轮转
  • 压缩:压缩旧日志节省空间
  • 保留天数:设置合理的保留天数
  • 手动轮转:测试和强制轮转

合理配置日志轮转,防止日志文件过大,方便日志管理。