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;
这样,日志就会按照天来分割记录了