nginx-日志-日志按天分割

    科技2022-08-13  105

    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 ~ "^(\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;

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

    Processed: 0.012, SQL: 8