备忘:logrotate.d (Nginx)日志文件分卷服务
实际是通用的日志分卷服务,备忘用于 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.log
和 access.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
