一、背景
nginx是一款非常优秀的网络代理工具,但是其日志管理有点缺憾:nginx的access_log会无限的增长。我们希望的是它能按照日期去做日志分割。一般有两种方法,自己写脚本实现,另一种是使用现成的logrotate工具。本文主要主要介绍第二种。
二、logrotate简介
logrotate软件是一个日志管理工具,用于分割日志,删除旧的日志文件,并创建新的日志文件,起到“转储作用”,可以为系统节省磁盘空间。一般linux系统已经自带安装好了。
logrotate是基于crontab运行的,其脚本是/etc/cron.daily/logtotate
,日志轮转是系统自发完成的,实际运行时,logrotate会调用配置文件/etc/logrotate.conf
。可以在/etc/logrotate.d
目录里放置自定义好的配置文件,用来覆盖logrotate.conf
的缺省值。
三、如何使用logrotate管理Nginx日志呢?
正式进入主题,假设nginx的日志目录是:/server/service/nginx/logs/
,整个过程使用root权限操作
1. 创建配置
> cd /etc/logrotate.d/
创建nginx日志配置文件
> vi nginx
增加配置
/server/service/nginx/logs/*.log {
daily
dateext
rotate 7
missingok
notifempty
sharedscripts
postrotate
if [ -f /server/service/nginx/logs/nginx.pid ]; then
kill -USR1 `cat /server/service/nginx/logs/nginx.pid`
fi
endscript
}
2. debug验证配置
注意:debug不会真正执行脚本逻辑,无需担心脚本对日志的影响
> /sbin/logrotate -d -f /etc/logrotate.d/nginx
执行之后将会打印脚本执行的具体步骤信息,从这里可以检查脚本的逻辑是否正确
> /sbin/logrotate -d -f /etc/logrotate.d/nginx
reading config file /etc/logrotate.d/nginx
Allocating hash table for state file, size 15360 B
Handling 1 logs
rotating pattern: /server/service/nginx/logs/*.log forced from command line (7 rotations)
empty log files are not rotated, old logs are removed
considering log /server/service/nginx/logs/access.log
log needs rotating
considering log /server/service/nginx/logs/error.log
log needs rotating
rotating log /server/service/nginx/logs/access.log, log->rotateCount is 7
dateext suffix '-20190418'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
glob finding old rotated logs failed
rotating log /server/service/nginx/logs/error.log, log->rotateCount is 7
dateext suffix '-20190418'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
glob finding old rotated logs failed
renaming /server/service/nginx/logs/access.log to /server/service/nginx/logs/access.log-20190418
renaming /server/service/nginx/logs/error.log to /server/service/nginx/logs/error.log-20190418
running postrotate script
running script with arg /server/service/nginx/logs/*.log : "
if [ -f /server/service/nginx/logs/nginx.pid ]; then
kill -USR1 `cat /server/service/nginx/logs/nginx.pid`
fi
"
3.测试配置效果
首先查看nginx的日志文件列表
> cd /server/service/nginx/logs/
> ls -lh
total 192M
-rw-r--r-- 1 root root 183M Apr 18 10:09 access.log
-rw-r--r-- 1 root root 9.2M Apr 18 10:13 error.log
-rw-r--r-- 1 root root 6 Apr 10 11:05 nginx.pid
手动执行脚本
> /sbin/logrotate -f /etc/logrotate.d/nginx
再次查看日志文件列表发现多了两个,说明脚本生效了
> ls -lh
total 192M
-rw-r--r-- 1 nobody root 0 Apr 18 10:20 access.log
-rw-r--r-- 1 root root 183M Apr 18 10:09 access.log-20190418
-rw-r--r-- 1 nobody root 0 Apr 18 10:20 error.log
-rw-r--r-- 1 root root 9.2M Apr 18 10:13 error.log-20190418
-rw-r--r-- 1 root root 6 Apr 10 11:05 nginx.pid
4. 创建定时
设置每天凌晨执行logrotate脚本
执行命令
> crontab -e
在最后一行增加如下脚本
59 23 * * * /usr/sbin/logrotate -f /etc/logrotate.d/nginx
四、logrotate配置参数说明
配置参数 | 功能说明 |
---|---|
compress | 通过gzip 压缩转储以后的日志 |
nocompress | 不做gzip压缩处理 |
copytruncate | 用于还在打开中的日志文件,把当前日志备份并截断;是先拷贝再清空的方式,拷贝和清空之间有一个时间差,可能会丢失部分日志数据。 |
nocopytruncate | 备份日志文件不过不截断 |
create mode owner group | 轮转时指定创建新文件的属性,如create 0777 nobody nobody |
nocreate | 不建立新的日志文件 |
delaycompress | 和compress 一起使用时,转储的日志文件到下一次转储时才压缩 |
nodelaycompress | 覆盖 delaycompress 选项,转储同时压缩。 |
missingok | 如果日志丢失,不报错继续滚动下一个日志 |
errors address | 专储时的错误信息发送到指定的Email 地址 |
ifempty | 即使日志文件为空文件也做轮转,这个是logrotate的缺省选项。 |
notifempty | 当日志文件为空时,不进行轮转 |
mail address | 把转储的日志文件发送到指定的E-mail 地址 |
nomail | 转储时不发送日志文件 |
olddir directory | 转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统 |
noolddir | 转储后的日志文件和当前日志文件放在同一个目录下 |
sharedscripts | 运行postrotate脚本,作用是在所有日志都轮转后统一执行一次脚本。如果没有配置这个,那么每个日志轮转后都会执行一次脚本 |
prerotate | 在logrotate转储之前需要执行的指令,例如修改文件的属性等动作;必须独立成行 |
postrotate | 在logrotate转储之后需要执行的指令,例如重新启动 (kill -HUP) 某个服务!必须独立成行 |
daily | 指定转储周期为每天 |
weekly | 指定转储周期为每周 |
monthly | 指定转储周期为每月 |
rotate count | 指定日志文件删除之前转储的次数,0 指没有备份,5 指保留5 个备份 |
dateext | 使用当期日期作为命名格式 |
dateformat .%s | 配合dateext使用,紧跟在下一行出现,定义文件切割后的文件名,必须配合dateext使用,只支持 %Y %m %d %s 这四个参数 |
size(或minsize) log-size | 当日志文件到达指定的大小时才转储,log-size能指定bytes(缺省)及KB (sizek)或MB(sizem). 当日志文件 >= log-size 的时候就转储。 以下为合法格式:(其他格式的单位大小写没有试过) size = 5 或 size 5 (>= 5 个字节就转储)size = 100k 或 size 100k size = 100M 或 size 100M |
结束
网友评论