共计 3364 个字符,预计需要花费 9 分钟才能阅读完成。
作为 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 问题解决 http://www.linuxidc.com/Linux/2014-12/110990.htm
通过参考上述内容可以快速的定制出来一个日志格式了,就在上一次做的虚拟主机里增加吧。
上次并没有自定义日志格式并且在限制访问的状态页面也没有启用访问日志,那就写一个吧。
log_format access ‘$remote_addr $remote_user “$time_local” $request’
‘$status $http_referer’
‘”$http_user_agent” $http_x_forwarded_for’;
添加的名称为 access 日志记录了 ip、用户、时间、相应方法及页面、状态码、从哪个链接过来的、用户代理、如果中间有代理也从代理获取用户 ip,然后将状态页面的访问日志打开并且给一个文件路径(此文件可以不存在,目录必须存在)然后在路径后面指定好我们刚才设置的名称,也将正常页面的访问日志引用自定义的日志格式。(原来是没有设置名称的,那么就为默认格式)
定义完成后看下是否配置正确
nginx -t
nginx 给了一个警告信息, 警告我们 log_format 可能使用在 /usr/local/nginx/nginx.conf 中的 http 等级下,如果要修复这个警告按照以下方法即可解决。
将我们的自定义信息放入到 nginx.conf 配置文件中的 http 里面(一定要在虚拟主机的配置文件中删除自定义的 log_format):
再次检查即可正常使用
将原来的 access.log 文件删除或者重命名,然后重读配置文件
cd /web/vhost/test1/logs/
mv test1.access.log access.log.bak
nginx -s reload #重读配置文件
然后访问下看看日志文件是否和我们自定义的内容一样:
状态页面的访问日志里记录了 ip、用户名、时间、请求方法、、访问的页面、页面状态码(由于定义的时候没有加“-”导致了效果不太好)、客户端使用的浏览器、以及代理服务器(本机访问的没有代理服务器所以就为 -)
自定义日志就结束了,接下来就是切割日志文件并且每天保存一份当天的日志文件方法如下:
首先将原来的日志文件重命名
mv test1.access.log test1.2014-12-29.log
nginx -s reload
这样就可以做到日志文件的切割。如果要每天自动保存的话就要基于 crontab 来管理了。写个脚本吧
#!/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 目录添加至系统环境变量中。
然后将这个脚本文件放到 nginx 的配置目录下添加定时计划
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
这样在每天的夜晚 12 点就会自动创建备份文件了,如果要对错误日志也每天备份的话按照上面的内容修改即可。
————————————– 分割线 ————————————–
CentOS 6.2 实战部署 Nginx+MySQL+PHP http://www.linuxidc.com/Linux/2013-09/90020.htm
使用 Nginx 搭建 WEB 服务器 http://www.linuxidc.com/Linux/2013-09/89768.htm
搭建基于 Linux6.3+Nginx1.2+PHP5+MySQL5.5 的 Web 服务器全过程 http://www.linuxidc.com/Linux/2013-09/89692.htm
CentOS 6.3 下 Nginx 性能调优 http://www.linuxidc.com/Linux/2013-09/89656.htm
CentOS 6.3 下配置 Nginx 加载 ngx_pagespeed 模块 http://www.linuxidc.com/Linux/2013-09/89657.htm
CentOS 6.4 安装配置 Nginx+Pcre+php-fpm http://www.linuxidc.com/Linux/2013-08/88984.htm
Nginx 安装配置使用详细笔记 http://www.linuxidc.com/Linux/2014-07/104499.htm
Nginx 日志过滤 使用 ngx_log_if 不记录特定日志 http://www.linuxidc.com/Linux/2014-07/104686.htm
————————————– 分割线 ————————————–
Nginx 的详细介绍 :请点这里
Nginx 的下载地址 :请点这里