实际是通用的日志分卷服务,备忘用于 nginx的情况

前言

nginx开启了日志,保存路径在 /home/wwwlogs/access.log
需要对定期日志分卷和打包,避免无人值守下把有限的磁盘空间给占满

配置 logrotate

logrotate 是什么,详细有哪些参数不细述。网上有很多资料了。

在配置文件的路径下新建一个配置文件,文件名任意主要便于区分是什么应用的日志分卷,这里叫做nginx好了。

cd /etc/logrotate.d/
vim nginx

内容如下

/home/wwwlogs/access.log {
        su root root
        compress
        weekly
        create 0644 root root
        missingok
        rotate 52
        notifempty
        dateext
        sharedscripts
        postrotate
            /bin/kill -USR1 `cat /usr/local/nginx/logs/nginx.pid` > /dev/null 2>&1 || true
            sleep 1
        endscript
}

配置解读

/home/wwwlogs/access.log需要操作的日志文件
su root root由于日志目录被配置成用户组是 root:root ,需要添加此行让logrotate有足够权限执行,否则报错。如非需要,去掉这行
compress切割分离出来的旧日志会被压缩成 gz格式,如果只需要分卷不需要压缩,去掉这行
weekly每周分卷一次,周日凌晨执行
create 0644 root root分卷之后,新创建一个空的access.log文件继续存储新日志,给这个日志指定权限和所属用户
missingok如果找不到文件,不用报错
rotate 52分卷保存52份,超出的循环删除
notifempty如果日志文件当前是空的,不作任何处理
dateext给分卷出来的日志文件名后加上日期时间戳 yyyymmdd, 如果不加这个参数,文件名后缀则顺序为 .1/.2/.3/...
sharedscripts
postrotate
endscript
这三个结合起来用,表示执行完分卷之后,触发运行一些 shell命令

再细说一下执行命令

/bin/kill -USR1 `cat /usr/local/nginx/logs/nginx.pid` > /dev/null 2>&1 || true

分卷操作实际上是把原来的 access.log -> 重命名为 access.log-20230607 ,然后再新建一个空文件 access.log
这样会有一个问题,就是nginx 写日志的内存指针仍然会指向 /home/wwwlogs/access.log-20230607
因此这一行的操作就是去让nginx更新指针指向新建的空日志文件。

注意nginx.pid可能因为 nginx的部署安装方式不同而在不同的路径下, 通过以下命令查找确认

find / -name nginx.pid

可以通过以下命令检查当前nginx正在把日志写入哪个文件

sudo lsof -nP | grep 'access.log'

验证配置

配置完毕后,可以手动执行一次查看效果

logrotate -vf /etc/logrotate.d/nginx

参数 f是立刻运行,v 是显示执行过程。
如果没有报错误,日志目录下应该生成 0 大小的 access.logaccess.log-20230607.tar.gz 分卷打包文件。

最后再检查一遍确认nginx正在向新文件写入日志,便大功告成。

root@-31884a:/home/wwwlogs# sudo lsof -nP | grep 'access.log'
nginx   270712     root   5w    REG      252,1    292     507914 /home/wwwlogs/access.log
nginx   270713     www    5w    REG      252,1    292     507914 /home/wwwlogs/access.log

标签: nginx, logrotate

添加新评论