概要
在日常运维中,日志切割是一个比较基础且重要的操作,可以自己编写shell实现,也可以借助于系统自带的软件来实现,今天我们使用linux自带的logrotate来实现对nginx日志的切割。
技术细节
Linux系统默认安装logrotate工具,它默认的配置文件在:
/etc/logrotate.conf
/etc/logrotate.d/
logrotate.conf 才主要的配置文件,logrotate.d 是一个目录,该目录里的所有文件都会被主动的读入/etc/logrotate.conf中执行,类似于nginx的vhost。
另外,如果 /etc/logrotate.d/ 里面的文件中没有设定一些细节,则会以/etc/logrotate.conf这个文件的设定来作为默认值。
查看版本
logrotate --version
# 查看默认配置文件
cat /etc/logrotate.conf
[root@ziyi ~]# cat /etc/logrotate.conf
weekly # 默认每周执行一次日志轮询
rotate 4 # 默认保留4个日志文件
create # 自动创建新的日志文件,新的文件和原来的文件具有相同的权限
dateext # 日志切割后,文件以当前日志为结尾,例如:messages-20181125
#compress # 指定不压缩转储文件,如果需要压缩,去掉注释就可以了。
include /etc/logrotate.d # 将/etc/logrotate.d目录中的配置文件加载进来
/var/log/wtmp { # 针对wtmp日志的配置参数
monthly # 每月切割一次
create 0664 root utmp # 新建日志的权限为0644,用户为root,组为utmp
minsize 1M # 文件大小超过1M后才会切割
rotate 1 # 只保留1个日志文件
}
/var/log/btmp {
missingok
monthly
create 0600 root utmp #新建日志的权限为0644,属主为root,属组为utmp
rotate 1
}
修改配置文件后,并不需要重启服务。 由于 /usr/sbin/logrotate 实际上只是一个可执行文件,不是以 daemon 运行。
/etc/logrotate.d/ 目录:存放自定义日志滚动策略,/etc/logrotate.d/ 目录,通常一些第三方软件包的配置, 如 yum,zabbix-agent,syslog,nginx 等
[root@ziyi logrotate.d]# cat yum
/var/log/yum.log {
missingok
notifempty
maxsize 30k
yearly
create 0600 root root
}
常用参数介绍
- 切割周期
切割周期,多久切割一次。
daily : 切割周期为 每天
weekly : 切割周期为 每周
monthly : 切割周期为 每月
yearly: 切割周期为 每年
- 切割大小
当日志文件到达指定的大小时才转储。
默认单位是 bytes。bytes (缺省) 及 KB (sizek) 或 MB (sizem)
如: size 30k、 size 50M
- 日志文件保留个数
日志文件保留备份的个数。默认是 0 。
如:0 指没有备份;5 指保留最近的5个备份,其余的全部删除。
- 日志保留天数:maxage 5
保留多少天的日志文件。
如:5 指保留最近的5天的日志文件,其余的全部删除。
如果 日志文件按天转储,则 rotate 与 maxage 基本上是一样的。
- 忽略日志转储间的错误
missing ok ,在日志轮循期间,错误将被忽略。
例如 “文件无法找到” 之类的错误。
- 日志截断策略
copytruncate: 用于还在打开中的日志文件,把当前日志备份并截断。 把正在输出的日志拷 (copy) 一份出来,再清空 (trucate) 原来的日志。
nocopytruncate: 备份日志文件,但是不截断 。
- 新生成的日志文件权限
create mode owner group:转储文件,使用指定的文件模式创建新的日志文件。
nocreate: 不建立新的日志文件。
如: create 644 root root
以指定的权限创建全新的日志文件,同时 logrotate 也会重命名原始日志文件。
- 是否压缩日志文件
nocompress: 不压缩(默认)
compress: 通过 gzip 压缩转储以后的日志。如 XXX.gz
- 是否延迟压缩
delaycompress: 和 compress 一起使用时,转储的日志文件到下一次转储时才压缩。
nodelaycompress: 覆盖 delaycompress 选项,转储同时压缩。
- 日志组脚本:sharedscripts,整个日志组都轮转后执行
共享脚本,整个日志组运行一次脚本 。
比如 nginx 涉及到多个日志文件,一般使用 * 号 通配符:/var/log/nginx/*.log { … } ,
sharedscripts 的作用是在 所有的日志文件 都轮转完毕后 统一执行一次脚本 ;
如果没有 sharedscripts ,那么 每个日志文件 轮转完毕后 都会执行一次脚本 。
- 空文件日志转存
ifempty :if empty ,即使是空文件也转储(默认)。
notifempty :not if empty ,如果是空文件的话,不转储。
- 转存后的日志放入指定位置:
olddir directory :储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统。
noolddir : 转储后的日志文件和当前日志文件放在同一个目录下。
- 日期后缀
在日志名称后面,添加日期后缀。默认是当前日期。默认是 -%Y%m%d 的后缀。可用 dateformat 选项扩展配置。
如:nginx_access.log --> nginx_access.log-20210120
注意: 格式化日期中不要出现 分号: ,因为文件名称是不能含有分号的。
- 扩展日志后缀
对 dateext 的拓展,必须配合 dateext 使用:
在V3.9.0 之前,只支持 %Y、%m、%d、 %s 参数。
%s 是时间戳。(1970-01-01 00:00:00 UTC以来的秒数)
dateformat -%Y-%m-%d-%s
在V3.9.0 及之后,支持 %H 参数。
nginx常用配置模版(宝塔安装):
[root@root ~]# cat /etc/logrotate.d/nginx
/www/wwwlogs/*.log { # 日志文件的路径
# 每天进行日志分割
daily
# 启用日期扩展功能
dateext
# 设置日期格式,例如:access-logs-2018-11-25
dateformat -%Y-%m-%d
# 如果日志文件丢失,则忽略错误
missingok
# 保留14份日志文件
rotate 14
# 旧日志文件在轮转后进行压缩
compress
# 如果日志文件为空,则不进行轮转
notifempty
# 创建新日志文件时的权限和所有者
create 644 www www
#指定备份日志存储目录
olddir /www/wwwlogs/weblogs
sharedscripts # 整个日志组运行一次脚本
postrotate
[ -f /www/server/nginx/logs/nginx.pid ] && kill -USR1 `cat /www/server/nginx/logs/nginx.pid` # 重启nginx,重新加载日志文件,防止日志无法写入新文件
endscript # 结束脚本
}
调试logrotate
logrotate [OPTION...] <configfile>
-d, --debug :debug 模式,测试配置文件是否有错误。
-f, --force :强制转储文件。
-m, --mail=command :压缩日志后,发送日志到指定邮箱。
-s, --state=statefile :使用指定的状态文件。
-v, --verbose :显示转储过程。
尝试执行
logrotate -f /etc/logrotate.d/nginx
如果遇到问题,尝试解决,如果不报错就代表运行成功了。
添加crontab任务
添加 crontab 计划任务(在 root 用户下,执行 crontab -e 进入 vim 模式,进行编辑)
[root@ziyi logrotate_mytime]# crontab -e
#每天 0点0分进行日志切割
0 0 * * * /usr/sbin/logrotate -f /etc/logrotate.d/nginx