方式一:使用shell脚本
1.1 编写shell脚本
Nginx_Log_Path="/usr/local/nginx/logs/"
Dateformat=$(date -d "yesterday" +%Y%m%d)
mv ${Nginx_Log_Path}/access.log ${Nginx_Log_Path}/access-${Dateformat}.log
mv ${Nginx_Log_Path}/access_8688.log ${Nginx_Log_Path}/access_8688-${Dateformat}.log
mv ${Nginx_Log_Path}/error.log ${Nginx_Log_Path}/error-${Dateformat}.log
/usr/local/nginx/sbin/nginx -s reopen
可以直接用win系统的文本编辑器来新建.sh。文件重命名为split_nginx_log.sh,并上传到服务器。
1.2 文件授权
[root@reader sbin]# chmod +x split_nginx_log.sh
1.3 手动执行脚本进行测试
[root@reader sbin]# pwd
/usr/local/nginx/sbin
[root@reader sbin]# ll
total 24836
-rwxr-xr-x 1 root root 7050624 Dec 30 20:15 nginx
-rwxr-xr-x 1 root root 6148992 Dec 8 20:30 nginx_20231208.bak
-rwxr-xr-x 1 root root 6066592 Nov 26 21:32 nginx_20231230.bak
-rwxr-xr-x 1 root root 6148992 Dec 30 20:01 nginx.bak
-rwxr-xr-x 1 root root 716 Jan 4 22:44 split_nginx_log.sh
[root@reader sbin]# split_nginx_log.sh
[root@reader sbin]#
如果执行脚本后提示以下错误
-bash: /usr/local/nginx/sbin/split_nginx_log.sh: /usr/bin/bash^M: bad interpreter: No such file or directory
说明文件格式不支持,因为windows系统的文件格式是dos,而linux系统是unix,所以需要将文件格式从dos修改为unix。
# 打开vim
vim split_nginx_log.sh
# 使用set修改ff
:set ff=unix
# 保存退出
:wq
1.4 使用crond执行脚本
[root@reader sbin]# crontab -e
00 00 * * * /bin/sh /usr/local/nginx/sbin/split_nginx_log.sh
### 执行:wq保存文件
方式二:灵活使用logrotate
Logrotate 是 CentOS 操作系统的内置日志管理工具,基于 anacrontab 实现计划任务,通过配置 logrotate,可以按照每天、周、月或达到某一大小的日志文件进行归档操作,并允许对日志文件实行压缩、删除或邮寄等操作。
2.1 在任意位置编写 logrotate_nginx_log 配置文件
注意:每个指令后面不能加注解,所以把注解都加在了每个指令的上面。
如果非要按天切割日志,需要把size、minsize指令配置注释掉。
[root@reader sbin]# pwd
/usr/local/nginx/sbin
[root@reader sbin]# touch logrotate_nginx_log
[root@reader sbin]# vim logrotate_nginx_log
[root@reader sbin]# cat logrotate_nginx_log
/usr/local/nginx/logs/*.log {
# 每天归档一次
daily
# 如果日志文件不存在,则不显示错误信息
missingok
# 日志文件最小为100kb时才执行归档,跟归档时间无关
size 100k
# 日志文件最小为100kb时才执行归档,没到归档执行时间,不会执行归档操作
minsize 100k
# 日志文件不为空时才执行归档
notifempty
# 为归档文件名添加日期,默认追加到扩展名后
dateext
# 设置归档文件名中的日期格式为-%Y%m%d,默认就是-%Y%m%d,可不添加该指令
#dateformat -%Y%m%d
# 使用前一天的日期而非创建归档文件时的日期作为归档文件的文件名中的日期
dateyesterday
# 归档文件名中保留日志的扩展名
extension .log
# 对归档文件启用压缩,默认为 gzip 压缩
compress
# 在下一个归档周期再对当前归档文件进行压缩
delaycompress
# 以创建新文件方式实现日志归档
create
# 设置归档文件保存目录
olddir backup
# 归档文件存储目录不存在时自动创建
createolddir
# 归档执行之后执行脚本,通知Nginx重新打开日志文件
postrotate /usr/local/nginx/sbin/nginx -s reopen
endscript
# 启用脚本共享模式会让 prerotate 和 postrotate 脚本在全局只运行一次
sharedscripts
# 设置过期归档文件的天数,归档文件最多保留7天
maxage 7
# 归档文件最多保留7份
rotate 7
}
2.2 测试配置文件
/usr/sbin/logrotate -d /usr/local/nginx/sbin/logrotate_nginx_log
执行完该命令后,并不会实际执行文件备份,只是用来检查配置文件是否正确,如有有错,会提示error,按照错误提示修改配置文件即可。
2.3 使用crond执行脚本
[root@reader sbin]# crontab -e
00 00 * * * /usr/sbin/logrotate -f /usr/local/nginx/sbin/logrotate_nginx_log
### 执行:wq保存文件
方式三:完全交由logrotate管理
3.1 在/etc/logrotate.d路径下创建配置文件
在/etc/logrotate.d路径下创建针对nginx日志备份的配置文件,文件命名为nginx。或者是将2.1步创建的文件cp到/etc/logrotate.d目录下。
[root@reader sbin]# cp logrotate_nginx_log /etc/logrotate.d/nginx
[root@reader sbin]# cd /etc/logrotate.d/
[root@reader logrotate.d]# ll
total 44
-rw-r--r--. 1 root root 91 May 14 2019 bootlog
-rw-r--r--. 1 root root 130 Feb 19 2018 btmp
-rw-r--r--. 1 root root 160 Apr 4 2018 chrony
-rw-r--r--. 1 root root 526 Jan 4 2019 dnf
-rw-r--r-- 1 root root 1575 Jan 8 16:15 nginx
-rw-r--r--. 1 root root 408 May 11 2019 psacct
-rw-r--r--. 1 root root 115 May 11 2019 samba
-rw-r--r--. 1 root root 237 Jul 2 2019 sssd
-rw-r--r--. 1 root root 226 May 14 2019 syslog
-rw-r--r--. 1 root root 32 Feb 19 2018 up2date
-rw-r--r--. 1 root root 145 Feb 19 2018 wtmp
[root@reader logrotate.d]#
3.2 重启crond服务,确保logrotate生效
# 重启crond服务
/bin/systemctl restart crond.service
Logrotate 配置指令如下
指令 | 指令说明 |
归档执行周期 | |
hourly | 日志归档周期为 1 小时,默认 Logrotate 的最小周期为 1 天,需额外调整该参数才可生效 |
daily | 日志归档周期为 1 天 |
weekly | 日志归档周期为 1 周 |
monthly | 日志归档周期为 1 月,通常为每月的第一天 |
归档执行条件 | |
include | 读取外部参数文件 |
missingok | 如果日志文件不存在,则不显示错误信息 |
nomissingok | 如果日志文件不存在,则显示错误信息。默认配置 |
size | 日志文件可被归档的最小值 |
minsize | 日志文件可被归档的最小值,没到归档周期执行时间,不会执行归档操作 |
maxsize | 日志文件超过设定值时,即使没到归档周期执行时间,也会执行归档操作 |
ifempty | 即使日志文件为空,也执行归档操作 |
notifempty | 如果日志文件为空,则不进行归档。默认设置 |
tabooext | 不对设置扩展名的日志文件执行归档操作 |
归档文件命名 | |
start count | 使用日志文件归档次数作为归档文件扩展名,count 默认值为 1,默认配置 |
dateext | 为归档文件名添加日期,默认追加到扩展名后 |
dateformat | 设置归档文件名中的日期格式,使用“%Y%m%d%H”作为说明符,默认为-%Y%m%d |
dateyesterday | 使用前一天的日期而非创建归档文件时的日期作为归档文件的文件名中的日期 |
extension | 指定日志的扩展名,并将其设置为归档文件的扩展名,启用压缩时,压缩的扩展名在最后 |
compressext | 启用压缩时,自定义归档文件扩展名,如将“.gz”改为“.ddd” |
归档文件保存方式 | |
compress | 对归档文件启用压缩,默认为 gzip 压缩 |
nocompress | 不压缩归档文件。默认设置 |
compresscmd | 指定压缩归档文件的命令,默认为 gzip 压缩 |
uncompresscmd | 指定解压归档文件的命令,默认为 gunzip 解压 |
compressoptions | 启用压缩时,设置压缩工具的命令选项 |
delaycompress | 在下一个归档周期再对当前归档文件进行压缩 |
nodelaycompress | 不延迟压缩。默认设置 |
归档执行方式 | |
copy | 为日志文件复制一个副本后再进行归档 |
nocopy | 不复制源日志文件。默认配置 |
copytruncate | 复制日志文件后清空日志文件的内容 |
nocopytruncate | 复制源日志文件后,不清空源文件。默认设置 |
create mode owner group, create owner group | 重命名日志文件,创建与日志文件同名的文件,默认 mode=0644 uid=0 gid=0,与 copy 指令不能同时使用 |
nocreate | 不创建与日志文件同名的文件。默认设置 |
olddir | 设置归档文件保存目录 |
noolddir | 归档文件与源文件在同一目录。默认设置 |
createolddir mode owner group | 如果 olddir 参数指定的目录不存在,则创建目录并指定属组,默认 mode = 0777 uid = 0 gid = 0 |
nocreateolddir | 当 olddir 参数设定目录不存在时,不创建目录。默认设置 |
prerotate ... endscript | 归档执行之前执行脚本,日志文件名为传入的第一个参数 |
postrotate ... endscript | 归档执行之后执行脚本,日志文件名为传入的第一个参数 |
firstaction ... endscript | prerotate 脚本之前,仅当第一个日志文件被开始执行归档操作时才执行脚本,日志文件名为传入的第一个参数 |
lastaction ... endscript | postrotate 脚本之后,仅当最后一个日志文件执行归档操作结束时才执行脚本,日志文件名为传入的第一个参数 |
preremove ... endscript | 删除日志文件之前执行脚本,日志文件名为传入的第一个参数 |
sharedscripts | 当匹配的日志文件为多个时,prerotate 和 postrotate 脚本会在每个日志文件执行归档操作时都执行一次,启用共享模式会让 prerotate 和 postrotate 脚本在全局只运行一次 |
nosharedscripts | 当匹配的日志文件为多个时,prerotate 和 postrotate 脚本会在每个日志文件执行归档操作时都执行一次。默认设置 |
su user group | 指定操作源文件执行归档操作的用户及属组 |
归档文件清理 | |
设置接收归档文件的邮件地址 | |
nomail | 不将归档文件发送到任何邮件地址 |
mailfirst | 将刚生成的归档文件发送到设置的邮箱 |
maillast | 将要超过 maxage 设置时间的归档文件发送到设置的邮箱 |
mахage | 设置过期归档文件的天数 |
rotate | 保留归档文件数,默认为 0 |
shred | 彻底删除 |
shredcycles count | 彻底删除时,覆盖文件的次数,默认为 3 |
noshred | 不彻底删除 |
关于上表有以下几点需要说明:
- copy 与 create 是两种互斥的归档执行方式;
- copy 方式是将日志文件复制一份后清空原日志文件的内容,并对复制的文件进行归档操作,应用程序继续向原日志文件输出日志。因日志文件复制与清空操作存在时间间隔,所以切割操作会因日志量的大小及实时产生的频率存在丢失的情况;
- create 方式是将日志文件重命名,因日志文件的 inode 编号不变,应用程序会向新命名的文件输出日志。Logrotate 新创建原日志文件名的文件后执行重启或以信号机制通知应用程序重新向新日志文件输出日志内容,完成切割操作;
- 当与同一自定义配置匹配的日志文件为多个时,会并发执行归档操作。