天天看点

Nginx日志文件格式及切割日志文件

        作为web服务器而言,日志是必不可少的也是需要经常查看的。此篇就来介绍下如何自定义Nginx中的日志格式以及使用crontab计划任务来做到每天切割一次日志文件从而做到方便管理。

        在Nginx中日志文件是由log_format这个指令来定义的,它的语法如下:

log_format    name    format
##    name:指的是日志格式的名称(后面调用)
##    format:设置日志具体格式的      

        在Nginx中有自己默认的日志格式,如下内容:

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';      

        默认给注释掉了,看一下解释吧。

$remote_addr 客户端的ip地址(如果中间有代理服务器那么这里显示的ip就为代理服务器的ip地址)
$remote_user 用于记录远程客户端的用户名称(一般为“-”)
$time_local 用于记录访问时间和时区
$request 用于记录请求的url以及请求方法
$status 响应状态码
$body_bytes_sent 给客户端发送的文件主体内容大小
$http_user_agent 用户所使用的代理(一般为浏览器)
$http_x_forwarded_for 可以记录客户端IP,通过代理服务器来记录客户端的ip地址
$http_referer 可以记录用户是从哪个链接访问过来的

        有时候可能就算启用了$http_x_forwarded_for也无法获取客户端的ip地址详情请参考此篇博文:nginx 日志获取不到远程访问ip问题解决 

        通过参考上述内容可以快速的定制出来一个日志格式了,就在上一次做的虚拟主机里增加吧。

Nginx日志文件格式及切割日志文件

        上次并没有自定义日志格式并且在限制访问的状态页面也没有启用访问日志,那就写一个吧。

        log_format access '$remote_addr $remote_user "$time_local" $request'
                        '$status $http_referer'
                        '"$http_user_agent" $http_x_forwarded_for';      

        添加的名称为access 日志记录了ip、用户、时间、相应方法及页面、状态码、从哪个链接过来的、用户代理、如果中间有代理也从代理获取用户ip,然后将状态页面的访问日志打开并且给一个文件路径(此文件可以不存在,目录必须存在)然后在路径后面指定好我们刚才设置的名称,也将正常页面的访问日志引用自定义的日志格式。(原来是没有设置名称的,那么就为默认格式)

Nginx日志文件格式及切割日志文件

        定义完成后看下是否配置正确

nginx -t      
Nginx日志文件格式及切割日志文件

        nginx给了一个警告信息,警告我们log_format可能使用在/usr/local/nginx/nginx.conf中的http等级下,如果要修复这个警告按照以下方法即可解决。

        将我们的自定义信息放入到nginx.conf配置文件中的http里面(一定要在虚拟主机的配置文件中删除自定义的log_format):

Nginx日志文件格式及切割日志文件

        再次检查即可正常使用

Nginx日志文件格式及切割日志文件

        将原来的access.log文件删除或者重命名,然后重读配置文件

cd /web/vhost/test1/logs/
mv test1.access.log access.log.bak
nginx -s reload    #重读配置文件      

        然后访问下看看日志文件是否和我们自定义的内容一样:

Nginx日志文件格式及切割日志文件

        状态页面的访问日志里记录了ip、用户名、时间、请求方法、、访问的页面、页面状态码(由于定义的时候没有加“-”导致了效果不太好)、客户端使用的浏览器、以及代理服务器(本机访问的没有代理服务器所以就为-)

        自定义日志就结束了,接下来就是切割日志文件并且每天保存一份当天的日志文件方法如下:

        首先将原来的日志文件重命名

mv test1.access.log test1.2014-12-29.log
nginx  -s reload      
#!/bin/bash
#
#
vhost=test1   ##定义虚拟主机的目录名
log_path=/web/vhost/logs        #指定日志文件要保存位置
access_log_path=/web/vhost/${vhost}/logs    #指定access日志所在路径
mkdir -p ${log_path}/$(date -d "yesterday" +"%y")/$(date -d "yesterday" +%m)/        ## 创建日期目录,date -d "yesterday" +"%y"获取年份后面那个是获取月份
mv ${access_log_path}/${vhost}.access.log ${log_path}/$(date -d "yesterday" +"%y")/$(date -d "yesterday" +%m)/$(date -d "yesterday" +%d).${vhost}.access.log   ## 这里将访问日志文件移动到备份的目录中如:/web/vhost/logs/14/12/28.test1.access.log
nginx -s reload        ##这里我的nginx在编译的时候使用--sbin-path=/usr/sbin/nginx这个参数了所以我可以直接使用nginx如果没有使用此参数请一定要将你的nginx安装目录下的sbin目录添加至系统环境变量中。      
mkdir /usr/local/nginx/bin && mv logs.sh /usr/local/nginx/bin/logs.sh
crontab -e
00 00 * * * /bin/bash /usr/local/nginx/bin/logs.sh      

继续阅读