nginx 日志文件分隔

Posted 南望孤笑

tags:

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

nginx命令

Nginx命令帮助如下

nginx -h

nginx version: nginx/0.8.45

Usage: nginx [-?hvVt] [-s signal] [-c filename] [-p prefix] [-g directives]

Options:

  -?,-h         : this help   // 帮助

  -v            : show version and exit // 显示版本

  -V            : show version and configure options then exit // 显示版本及配置选项

  -t            : test configuration and exit // 测试配置文件,非常重要

  -s signal     : send signal to a master process: stop, quit, reopen, reload // 发送信号

  -p prefix     : set prefix path (default: /opt/nginx-0.8.45/)

  -c filename   : set configuration file (default: conf/nginx.conf) // 指定配置文件

  -g directives : set global directives out of configuration file

技术分享图片

上图是nginx官方网站对nginx信号的解释文档截取

下面是一些常见nginx命令

nginx -c /path/to/nginx.conf  // 以特定目录下的配置文件启动nginx:

nginx -s  reload  // 修改配置后重新加载生效

nginx -s  reopen   // 重新打开日志文件

nginx -s stop  // 快速停止nginx

nginx -s quit  // 完整有序的停止nginx

nginx -t     // 测试当前配置文件是否正确

nginx -t -c /path/to/nginx.conf  //测试特定的nginx配置文件是否正确

 

Nginx日志切割

为什么要切割日志?一般Nginx安装好后有些人会打开日志记录,有些人会关闭日志记录,打开日志记录的人一般都会把架设在Nginx上的所有网站日志都存在同一个文件里(比如我存在access.log日志文件里),这样日积月累所有网站的访问记录就会把日志文件越积越大,当需要查看日志文件的时候一看就是一大串,不方便查找。现在,如果我把每天的日志文件分割开来用相应的日期标识出来这样就大大方便查找了。

我是建议打开日志记录,日志记录里面存放着很多有用的东西。比如:浏览器名称,可以方便你对网站的排版做出调整;IP地址,如果网站收到攻击,你就可以查到那个IP地址。

Linux下我们可以简单的把日志文件mv走,但是你会发现mv走后新的日志文件没有重新生成,一般linux下用的文件句柄,文件被打开情况下你mv走文件,但是原来操作这个文件的进程还是有这个文件的inode等信息,原进程还是读写原来的文件,因此简单的mv是无法生效的。

因此建议过程如下

1. mv原文件到新文件目录中,这个时候 nginx还写这个文件(写入新位置文件中了)

2. 调用nginx -s  reopen用来打开日志文件,这样nginx会把新日志信息写入这个新的文件中

这样完成了日志的切割工作, 同时切割过程中没有日志的丢失

 

1 编写 shell 脚本

#!/bin/bash

    LOGS_PATH=/usr/local/nginx/logs
    YESTERDAY=$(date -d "yesterday" +%Y-%m-%d)
    mv ${LOGS_PATH}/access.log ${LOGS_PATH}/access_${YESTERDAY}.log
    mv ${LOGS_PATH}/error.log ${LOGS_PATH}/error_${YESTERDAY}.log

    # 以下任选其一
    /usr/local/nginx/sbin/nginx -s reopen
    # 或者
    # kill -USR1 $(cat /usr/local/nginx/logs/nginx.pid)

该脚本以天为单位分割,使用 reopen 信号重新配置日志,或者向 nginx 主进程发送 usr1 信号。
命名为 NginxLogRotate.sh,保存到目录 /usr/local/nginx/logs

2 设置定时任务

新建 crontab 任务:

crontab -e

编辑文件,每天 00:00 以 root 身份执行脚本

0 0 * * * root /usr/local/nginx/logs/nginxLogRotate.sh

 

nginx -s  reload 命令加载修改后的配置文件,命令下达后发生如下事件

1. Nginx的master进程检查配置文件的正确性,若是错误则返回错误信息,nginx继续采用原配置文件进行工作(因为worker未受到影响)

2. Nginx启动新的worker进程,采用新的配置文件

3. Nginx将新的请求分配新的worker进程

4. Nginx等待以前的worker进程的全部请求已经都返回后,关闭相关worker进程

5. 重复上面过程,知道全部旧的worker进程都被关闭掉


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

Shell脚本切割日志

nginx优化与防盗链

nginx 日志按照日期分割

编写一个程序, 将 a.txt 文件中的单词与 b.txt 文件中的 单词交替合并到 c.txt 文件中, a.txt 文件中的单词用回车符 分隔, b.txt 文件中用回车或空格进行分隔。(代码片段

使用awk统nginx日志文件ip访问站点次数

多维度分析统计nginx访问日志