方式一:使用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

指定操作源文件执行归档操作的用户及属组

归档文件清理

mail

设置接收归档文件的邮件地址

nomail

不将归档文件发送到任何邮件地址

mailfirst

将刚生成的归档文件发送到设置的邮箱

maillast

将要超过 maxage 设置时间的归档文件发送到设置的邮箱

mахage

设置过期归档文件的天数

rotate

保留归档文件数,默认为 0

shred

彻底删除

shredcycles count

彻底删除时,覆盖文件的次数,默认为 3

noshred

不彻底删除

关于上表有以下几点需要说明:

  • copy 与 create 是两种互斥的归档执行方式;
  • copy 方式是将日志文件复制一份后清空原日志文件的内容,并对复制的文件进行归档操作,应用程序继续向原日志文件输出日志。因日志文件复制与清空操作存在时间间隔,所以切割操作会因日志量的大小及实时产生的频率存在丢失的情况;
  • create 方式是将日志文件重命名,因日志文件的 inode 编号不变,应用程序会向新命名的文件输出日志。Logrotate 新创建原日志文件名的文件后执行重启或以信号机制通知应用程序重新向新日志文件输出日志内容,完成切割操作;
  • 当与同一自定义配置匹配的日志文件为多个时,会并发执行归档操作。