痛饮狂歌

使用 Logrotate 管理 Nginx 日志的完整指南

2025-07-05
8 分钟阅读
入门教程

Logrotate 是 Linux 系统标准的日志管理工具,特别适合处理 Nginx 日志。

#Logrotate #日志 #服务器

使用 Logrotate 管理 Nginx 日志的完整指南

Logrotate 是 Linux 系统标准的日志管理工具,特别适合处理 Nginx 日志。以下是详细配置步骤:

1. 创建 Logrotate 配置文件

sudo nano /etc/logrotate.d/nginx

输入以下内容(根据你的系统调整用户/组):

/var/log/nginx/*.log {
    daily                  # 每天轮转
    missingok              # 如果日志不存在,不报错
    rotate 14             # 保留14天的日志(压缩后)
    compress              # 压缩旧日志
    delaycompress         # 延迟一天压缩(保留未压缩的最近日志)
    notifempty            # 空日志不轮转
    create 0640 www-data adm # 创建新日志文件的权限(Ubuntu)
    # create 0640 nginx nginx # CentOS/RHEL
    sharedscripts         # 所有日志处理完后执行一次脚本
    postrotate            # 轮转后执行的命令
        # 向 Nginx 主进程发送 USR1 信号,通知重新打开日志
        [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
    endscript
}

2. 配置详解

选项说明
daily每天轮转日志
rotate 14保留14份旧日志(14天)
compress使用 gzip 压缩旧日志
delaycompress延迟一天压缩(保留最新日志未压缩)
create 0640 www-data adm创建新日志文件,设置权限和所有者
sharedscripts所有日志处理完后执行一次脚本
postrotate轮转后执行的命令
missingok日志文件不存在时不报错
notifempty空日志文件不轮转

3. 测试 Logrotate 配置

手动测试

# 测试配置文件语法
sudo logrotate -d /etc/logrotate.d/nginx

# 强制立即执行轮转(-v 详细输出,-f 强制)
sudo logrotate -vf /etc/logrotate.d/nginx

验证效果

# 查看日志文件
ls -lh /var/log/nginx/

应该看到类似:

access.log       # 新的当前日志
access.log.1     # 昨天的日志(未压缩)
access.log.2.gz  # 前天的日志(已压缩)
...

4. 自定义配置示例

保留90天日志(适用于高流量站点)

/var/log/nginx/*.log {
    daily
    rotate 90
    ...
}

按小时轮转(超高频访问)

/var/log/nginx/*.log {
    hourly
    rotate 168  # 保留7天(24小时×7)
    ...
}

处理特定日志文件

/var/log/nginx/access.log
/var/log/nginx/error.log {
    daily
    rotate 30
    ...
}

最大日志大小限制

/var/log/nginx/*.log {
    size 100M    # 当日志达到100MB时轮转
    rotate 5     # 保留5份旧日志
    ...
}

5. 解决常见问题

权限问题修复

# Ubuntu/Debian
sudo chown -R www-data:adm /var/log/nginx/
sudo chmod 755 /var/log/nginx/

# CentOS/RHEL
sudo chown -R nginx:nginx /var/log/nginx/

手动创建日志文件

sudo touch /var/log/nginx/access.log
sudo chown www-data:adm /var/log/nginx/access.log  # Ubuntu
sudo chown nginx:nginx /var/log/nginx/access.log   # CentOS

检查 Logrotate 状态

# 查看 Logrotate 最后执行时间
grep logrotate /var/log/syslog | tail

# 检查 cron 是否配置
ls /etc/cron.daily/logrotate

6. Logrotate 工作原理

1. 定时执行:通过 /etc/cron.daily/logrotate 每天自动运行

2. 配置文件:读取 /etc/logrotate.conf 和 /etc/logrotate.d/*

3. 执行流程:

  • 重命名当前日志文件(如 access.log → access.log.1)
  • 创建新的空日志文件
  • 发送信号通知 Nginx 重新打开日志文件
  • 压缩旧日志(根据 delaycompress 设置)
  • 删除超期的旧日志

7. 进阶技巧

自定义压缩程序

compresscmd /usr/bin/xz
compressoptions -9
compressext .xz

邮件通知

mail admin@example.com

按日期命名旧日志

dateext                     # 使用日期作为后缀
dateformat -%Y%m%d          # 日期格式:-20231015

处理完成后执行脚本

lastaction
    # 例如:将日志上传到云存储
    /usr/local/bin/upload-logs.sh
endscript

8. 验证 Nginx 日志重开

检查 Nginx 进程是否接收到 USR1 信号:

sudo journalctl -u nginx | grep 'USR1'

应该看到类似:

nginx: signal process started

9. 恢复误删日志文件

如果日志文件意外丢失:

# 重新创建日志文件
sudo touch /var/log/nginx/access.log
sudo chown www-data:adm /var/log/nginx/access.log # Ubuntu

# 通知 Nginx 重新打开日志
sudo kill -USR1 $(cat /var/run/nginx.pid)

通过以上配置,Logrotate 会自动管理你的 Nginx 日志,实现每日分割、压缩和清理旧日志,保持服务器存储空间高效利用。

/www/wwwlogs/www.liandian.com.log
/www/wwwlogs/www.liandian.com.error.log {
    daily
    missingok
    rotate 180
    compress
    delaycompress
    notifempty
    create 0640 www www
    sharedscripts
    dateext
    dateformat -%Y%m%d
    postrotate
        # 使用更精确的文件检查和现代语法
        if [ -f /www/server/nginx/logs/nginx.pid ]; then
            kill -USR1 $(cat /www/server/nginx/logs/nginx.pid)
        else
            echo "Nginx PID file not found at /www/server/nginx/logs/nginx.pid" >&2
        fi
    endscript
}