nginx-日志-日志按天分割

Posted 龙叔运维

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nginx-日志-日志按天分割相关的知识,希望对你有一定的参考价值。

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.log

kill -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_i​so8601内嵌变量来获取时间。time_iso8601格式如下:2015-08-07T18:12:02+02:00。然后使用正则表达式来获取所需时间的数据。


        if ($time_iso8601 ~ "^(\\d4)-(\\d2)-(\\d2)")
            set $year $1;
            set $month $2;
            set $day $3;
       

        access_log  /usr/local/nginx/logs/host.access-$year-$month-$day.log  main;


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

以上是关于nginx-日志-日志按天分割的主要内容,如果未能解决你的问题,请参考以下文章

nginx按天切割日志

Nginx日志轮询切割

Apache配置实现日志按天分割并删除指定几天前的日志

NGINX按天切割日志

Tomcat catalina.out日志使用log4j按天分割

Nginx日志按日期切割详解(按天切割)