1 脚本实现
1.1手工单次执行
【重命名并移动文件】mv /usr/local/nginx/logs/access.log /var/log/nginx_bak/20201005.log

【重新生成心的日志文件】kill -USR1 Nginx主进程号

举例说明

原本的日志样子

[root@wxl-1 logs]# ll
 总用量 12
 -rw-r–r–. 1 nobody root 207 10月 5 14:49 access.log
 -rw-r–r–. 1 nobody root 843 10月 5 14:36 error.log
 -rw-r–r–. 1 root root 5 10月 5 14:32 nginx.pid重命名并移动日志文件
 [root@wxl-1 logs]# mv /usr/local/nginx/logs/access.log /var/log/nginx_bak/20201005.log
 [root@wxl-1 logs]# ll
 总用量 8
 -rw-r–r–. 1 nobody root 843 10月 5 14:36 error.log
 -rw-r–r–. 1 root root 5 10月 5 14:32 nginx.pid
 [root@wxl-1 logs]# ll /var/log/nginx_bak/
 总用量 4
 -rw-r–r–. 1 nobody root 207 10月 5 14:49 20201005.log这个时候访问nginx,会发现日志依然记录到了重命名移动的日志文件中,没有新的日志文件生成
 [root@wxl-1 logs]# ll
 总用量 8
 -rw-r–r–. 1 nobody root 843 10月 5 14:36 error.log
 -rw-r–r–. 1 root root 5 10月 5 14:32 nginx.pid
 [root@wxl-1 logs]# ll /var/log/nginx_bak/
 总用量 4
 -rw-r–r–. 1 nobody root 828 10月 5 14:51 20201005.logkill -USER1 之后 就产生了新的日志文件,并且再次访问之后,新的访问记录写到了新日志文件中,不会再写道备份的日志中
 [root@wxl-1 logs]# kill -USR1 1152
 [root@wxl-1 logs]# ll
 总用量 12
 -rw-r–r–. 1 nobody root 828 10月 5 14:52 access.log
 -rw-r–r–. 1 nobody root 843 10月 5 14:36 error.log
 -rw-r–r–. 1 root root 5 10月 5 14:32 nginx.pid
 [root@wxl-1 logs]# ll /var/log/nginx_bak/
 总用量 4
 -rw-r–r–. 1 nobody root 828 10月 5 14:51 20201005.log

1.2 自动化脚本
可以写个切割日志备份的脚本,用crontab定时执行,这样就可以实现按照天进行日志分割以及备份

脚本可以参考如下,根据需要可以调整:

#/bin/bash 
 
yesterday=$(date +%Y-%m-%d)  #取得服务器当前时间
 
savepath_log=' /var/log/nginx_bak'#分割后的日志文件保存目录(注意结尾目录斜杠去掉)
 
nglogs='/usr/local/nginx/logs'  #nginx日志文件目录,具体根据实际地址替换(结尾目录斜杠去掉 以免与下面路径中的"/"重复)
 
 
 
#判断分割日志保存目录是否存在不存在则创建 
 
if [ ! -d ${savepath_log} ]   # 注意 语句之间 空格不可省略,这是bash脚本 不是php脚本那样随和 
 
then
 
mkdir -p ${savepath_log}
 
fi 
 
#通过mv命令将日志移动到分割后的日志目录里,然后发送kill -USR1信号给Nginx的主进程号,让Nginx重新生成一个新的日志文件。
 
mv ${nglogs}/access.log  ${savepath_log}/access_${yesterday}.log  #具体根据你的实际日志文件名路径 进行修改access.log名字
 
mv ${nglogs}/error.log  ${savepath_log}/error_${yesterday}.log  #具体根据实际日志文件名地址 修改error.log名字
 
mv ${nglogs}/host.access.log  ${savepath_log}/host.access_${yesterday}.log 
kill -USR1 $(cat /usr/local/nginx/logs/nginx.pid)  #通知nginx重新生成新的日志

添加定时任务

crontab -e 后添加下面内容

59 23 * * * /usr/local/nginx/log_bak.sh(自己写的脚本的路径)

这样每天的23点59就会将当天的日志进行备份,并生辰新的日志文件继续记录访问日志

2 配置文件实现
ngxin的配置文件中也是可以用配置来实现按照天进行分割来记录日志的,如下:

time_iso8601内嵌变量来获取时间。time_iso8601格式如下:2015-08-07T18:12:02+02:00。然后使用正则表达式来获取所需时间的数据。

if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})") {
            set $year $1;
            set $month $2;
            set $day $3;
        }
 
        access_log  /usr/local/nginx/logs/host.access-$year-$month-$day.log  main;

这样,日志就会按照天来分割记录了