nginx使用logrotate日志分割和压缩

查看linux系统内logrotate logrotate --version 1. 创建一个命名nginx的文件 第一行和第二行修改为你的nginx日志目录 create 0640 root root 其中 root 修改为自己实际运行的用户 倒数第四行中 nginx.pid 修改为你的nginx

查看linux系统内logrotate

logrotate --version

1. 创建一个命名nginx的文件

第一行和第二行修改为你的nginx日志目录

create 0640 root root 其中 root 修改为自己实际运行的用户

倒数第四行中 nginx.pid 修改为你的nginx的pid目录

#根据日志是否达到500M分割日志,分割的日志根据当前日期
/usr/local/nginx/logs/access.log
/usr/local/nginx/logs/error.log {
    dateext
    dateformat -%Y-%m-%d
    size 500M
    missingok
    rotate 60
    compress
    delaycompress
    notifempty
    create 0640 root root
    sharedscripts
    postrotate
        # 通知Nginx重新打开日志文件(关键!请确保PID路径正确)
        if [ -f /usr/local/nginx/logs/nginx.pid ]; then
            kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
        fi
    endscript
}

#每日分割一次日志,分割的日志根据当前日期
/usr/local/nginx/logs/access.log
/usr/local/nginx/logs/error.log {
    dateext
    dateformat -%Y-%m-%d
    daily
    missingok
    rotate 60
    compress
    delaycompress
    notifempty
    create 0640 root root
    sharedscripts
    postrotate
        # 通知Nginx重新打开日志文件(关键!请确保PID路径正确)
        if [ -f /usr/local/nginx/logs/nginx.pid ]; then
            kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
        fi
    endscript
}

#上面两个选一个配置即可

2. nginx 放入 /etc/logrotate.d/ 中

3. 测试是否配置成功

sudo logrotate -d /etc/logrotate.d/nginx  # 调试模式,验证配置是否正确
sudo logrotate -vf /etc/logrotate.d/nginx # 强制立即执行一次切割并显示详细输出

4. 设置每小时运行一次

sudo crontab -e

添加一行

0 * * * * /usr/sbin/logrotate -s /etc/logrotate.d/nginx

sudo crontab -l 查看添加的行是否一致

查看运行计划是否执行

tail -f /var/log/cron

如果不设置 cron 默认每天运行一次 /etc/logrotate.d/ 文件下所有文件

5. 扩展

1. 如果分割日志后,新的日志文件一直为空,日志一直写入到了旧的文件中,需要添加一下几行代码

出现以上原因是因为logrotate分割日志后应用程序的写入句柄没有更新,应用程序还是会把日志写入到旧的日志文件中。

2c26593ed818492e978555218dc9c0ee.png
#第一个方法
/var/log/nginx/*.log {
    daily
    missingok
    rotate 52
    compress
    delaycompress
    notifempty
    create 0640 root root
    su root root 
    sharedscripts
    copytruncate  #添加这一行,这个选项让 logrotate 先将当前日志文件复制一份作为备份,然后清空原文件,而不是移动它。这样应用程序持有的文件句柄仍然指向被清空的原文件。
    postrotate
        if [ -f /var/run/nginx.pid ]; then
            kill -USR1 `cat /var/run/nginx.pid`
        fi
    endscript
}


#第二个方法
/var/log/nginx/*.log {
    daily
    missingok
    rotate 52
    compress
    delaycompress
    notifempty
    create 0640 root root
    su root root 
    sharedscripts
    killall -HUP nginx  #添加这一行,如果应用支持,发送特定信号重新打开日志
    postrotate
        if [ -f /var/run/nginx.pid ]; then
            kill -USR1 `cat /var/run/nginx.pid`
        fi
    endscript
}

2. 问题 windows 的换行符在 linux 上不可使用

使用vim打开文件,

进入“末行模式”,输入:set ff=unix回车执行,告诉编辑器改为unix换行符

输入:w回车,完成保存

3. 如果出现 logrotate 执行错误 lines must begin with a keyword or a filename (possibly in double quotes)

具体可前往 https://blog.csdn.net/utopia/article/details/103631734 查看

4. 如果强制执行 sudo logrotate -vf /etc/logrotate.d/nginx 不成功。

access.log 或者 error.log 文件里面内容必须要有数据才会分割。

5. 如果出现 set su directive in config considering log  这个错误。

#linux登录的用户为root

/var/log/nginx/*.log {
    daily
    missingok
    rotate 52
    compress
    delaycompress
    notifempty
    create 0640 root root
    su root root  # 添加这行
    sharedscripts
    postrotate
        if [ -f /var/run/nginx.pid ]; then
            kill -USR1 `cat /var/run/nginx.pid`
        fi
    endscript
}


LICENSED UNDER CC BY-NC-SA 4.0
评论