使用 logrotate 切割 nginx 日志

由于 nginx 默认的日志文件 access.log 和 error.log
随着使用时间的增长会导致文件大小越来越大,甚至用一些编辑器打开都会直接卡死。想着要是能和程序日志一样能够自动切割、归档该多好。于是在网上搜索一番后,决定采用
linux 自带的 logrotate 和 crontab 来实现这个功能。

本文操作服务器版本:CentOS Linux release 7.6.1810 (Core)

一、 安装 logrotate

查看本机是否已安装 logrotate

which logrotate

如果未安装:

 

  • 在基于 Debian 的系统上,可以运行:
    sudo apt-get install logrotate
  • 在基于Red Hat的系统上,可以运行: 
    sudo yum install logrotate

 

二、新建 logrotate 配置文件

安装好后应该会有一个 /etc/logrotate.d 目录,cd 到该目录下,新建一个关于 nginx 日志切割规则的配置文件:

cd /etc/logrotate.d

vim nginx_log_rotate

在新建的文件中输入以下内容:

/usr/local/env/nginx/nginx-1.22.1/logs/*.log {
    daily
    dateext
    minsize 10M
    missingok
    rotate 365
    compress
    delaycompress
    create 0640 root root
    sharedscripts
    postrotate
        /bin/kill -USR1 $(cat /usr/local/env/nginx/nginx-1.22.1/logs/nginx.pid 2>/dev/null) 2>/dev/null || true
    endscript
}

其中,部分常用参数表示的含义:

  • daily:表示每天切割一次日志,还支持 weekly(每周)、monthly(每月)
  • dateext:加上日期作为扩展名。
  • minsize 10M:文件大小达到 10M 才会进行切割。
  • missingok:如果日志文件不存在,不报错。
  • rotate 365:保留最近的 365 个日志文件。
  • compress:压缩旧的日志文件(默认使用 gzip)。
  • delaycompress:压缩的日志文件延迟压缩,以允许 Nginx 重新启动。
  • notifempty:如果日志文件为空,不切割(不推荐)。
  • create:创建新的日志文件时设置文件权限和所有者。
  • sharedscripts:在所有日志文件切割之后执行一次 postrotate 脚本。
  • postrotate:在切割后,需要执行的 shell 脚本,这里是发送 USR1 信号给 Nginx 以重新打开日志文件,以避免日志丢失。

更多更详细的配置可参考:日志 logrotate

三、配置定时任务

打开 crontab 文件:

vim /etc/crontab

写入以下命令:

# 每天 23:59 执行日志轮换操作,不选择 0 点是因为这时候日期已经跨天了,
# logrotate 归档时的日期就变成第二天了,这样归档出来的日期是不对的。
#  >/dev/null 2>&1 表示输出的信息不显示。
# -f 表示强制切割文件,即使日志文件的大小还不满足配置的最小值也会被切割
59 23 * * * root /usr/sbin/logrotate -f /etc/logrotate.d/nginx_log_rotate > /dev/null 2>&1

然后重启 crontab 即可:

systemctl restart crond
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值