zoukankan      html  css  js  c++  java
  • nginx日志文件的定时切割与归纳

    应用环境:生产环境中的Nginx服务器,由于访问日志文件增长速度非常快,日志太大会严重影响服务器效率。同时,为了

          方便对日志进行分析计算,须要对日志文件进行定时切割。定时切割的方式有按月切割、按天切割、按小时切割等,

          最常用的是按天切割。 

    切割原理:Nginx不支持像Apache 一样使用cronolog来轮循日志,但是可以用以下方案来实现:

           ①更改文件名:         mv  /data/logs/access.log  /data/logs/access_2017-12-20.log    

           ②重建access.log文件:     kill  -USR1  Nginx主进程号   //关于kill -USR1在文章最底处补充说明

          通过mv命令将日志文件重命名为/data/logs/access_2017-12-20.log,然后发送kill -USR1信号给Nginx的主进程号,

          让Nginx重新生成一个新的日志文件/data/logs/access.log。

    新建脚本

       ~]# vim  /opt/script/nginx_cut_access.sh    //假设我在该目录下新建脚本,内容如下:

    #!/bin/bash
    # Nginx_access按天切割归纳
    
    # Nginx_access日志文件的存放路径
    logs_path="/opt/nginx/logs/access/"
    
    mkdir -p ${logs_path}$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")/
    mv ${logs_path}access.log ${logs_path}$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")/access_$(date -d "yesterday" +"%Y%m%d").log
    kill -USR1 `cat /opt/nginx/logs/nginx.pid`

       

    定时执行

       ~]#crontab  -e    //编辑定时任务,内容如下:

        00 00 * * * /bin/bash /opt/script/nginx_cut_access.sh 

       保存,退出;

       说明:这个脚本和crontab配置主要实现的功能为:假设今天的日期为2018年1月1日,Nginx当前的日志文件为/opt/nginx/logs/access/access.log,

          2018年1月2日的零点(00:00)会执行这个nginx_cut_access.sh脚本,该脚本功能是先创建一个目录/opt/nginx/logs/access/2018/1/,然

          后将/opt/nginx/logs/access/access.log文件移动并重命名为/opt/nginx/logs/access/2018/1/access_2018-1-1.log,再发送kill -USR1信号给

          Nginx主进程号,告诉Nginx重新生成一个/opt/nginx/logs/access/access.log文件,2018年1月2日的日志记录在这个新生成的日志文件中。

          而/opt/nginx/logs/access/2018/1/access_2018-1-1.log文件,就是2018年1月1日的日志文件。

    补充:①关于kill USR1

         USR1亦通常被用来告知应用程序重载配置文件;例如,向Apache HTTP服务器发送一个USR1信号将导致以下步骤的发生:

       停止接受新的连接,等待当前连接停止,重新载入配置文件,重新打开日志文件,重启服务器,从而实现相对平滑的不关机的更改

         在此例中,在没有执行 kill -USR1 `cat /opt/nginx/logs/nginx.pid` 之前,即便已经对文件执行了mv更名命令,Nginx还是会向新命名

       的文件中照常写入日志数据的,原因在于:linux系统中,内核是根据文件描述符来找文件的。

       ②关于文件描述符

         文件描述符是linux内核为每个打开的文件命名的一个整数标识

         Linux内核为每一个进程生成(或者说维护)一个”文件描述符表”,这个文件描述符表记录的是“此进程所打开的文件(进行标识)”。

       在这里的环境中,nginx就是一个运行中的进程,这个进程早就打开了一个日志文件,在文件描述符表是记录了文件的,即便日志文件的路径改变了,

       但是还是能够找到(根据文件描述符表可以定位)。

         在Nginx中,当接收到USR1信号的时候,让Nginx重新打开日志文件,具体原理如下:

         1. nginx 的主进程收到USR1信号,会重新打开日志文件(以nginx配置文件中的日志名称命名,就是配置文件中access_log项所设置的值,

          如果文件不存在,会自动创建一个新的文件access.log);

         2. 然后把日志文件的拥有者改为“工作进程(worker进程)”,目的是让worker进程就具备了对日志文件的读写权限(master和worker通常以

          不同用户运行,所以需要改变拥有者);

         3. nginx主进程会关闭重名的日志文件(也就是刚才使用mv命令重命名成access_ 2018-1-1.log的文件),并通知工作进程使用新打开的日志

          文件(刚才主进程打开的文件access.log)。具体实现上更细化点就是,主进程把USR1信号发给worker,worker接到这个信号后,会重新打开

          日志文件(也就是配置文件中约定的access.log);

    结束.

          

       

  • 相关阅读:
    APP测试点总结
    总结了一些指针易出错的常见问题(四)
    总结了一些指针易出错的常见问题(三)
    总结了一些指针易出错的常见问题(二)
    C++/C头文件 .h和 .c
    今天研究了一下手机通信录管理系统(C语言)
    Android软件测试Monkey测试工具
    nio之netty3的应用
    java io之管道流
    java nio之Buffer
  • 原文地址:https://www.cnblogs.com/ding2016/p/8073837.html
Copyright © 2011-2022 走看看