1.Nginx日志管理
1.日志简单介绍
Nginx提供了日志记录的功能,日志文件在对我们管理网站十分有用,通过访问日志(access_log)我们可以获取请求来源、客户端信息、请求的资源等信息;通过错误日志(error_log)可以获取错误发生时间、错误信息等,方便我们及时定位和修复错误。看一下Nginx中日志相关的指令。
#设置访问日志:访问日志文件为nginx/logs/mysite.access.log,格式为main access_log logs/mysite.access.log main;
位置 格式 #设置错误日志:错误日志文件为nginx/logs/mysite.error.log,记录级别为error error_log logs/mysite.error.log error;
位置 级别 #定义main格式的日志 log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"';
在Nginx日志中严重程度:debug<info<notice<warn<error<crit,一般记录warn/error级别;定义日志格式中,$开头的是Nginx中的变量,在前面已经总结过了,为了方便查看本篇底部也放了一份。记录网站的访问/错误日志,十分简单,只需要把access_log/error_log指令放在需要记录的server主机内即可。也可以把access_log/error_log指令放在http中用来记录全局日志。
看一个简单的Nginx配置文件,为了方便演示,这里只配置了默认主机,并删去了Nginx中一些和日志不相关的配置:
worker_processes 2; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream;#定义main格式的日志 log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; #默认主机 server{ listen 80; server_name localhost; location /{ root html; index index.html; } #访问日志,名字问nginx/logs/mysite.access.log,格式为main格式 access_log logs/mysite.access.log main; #错误日志,记录级别为error error_log logs/mysite.error.log error; } }
当我们输入虚拟机IP会访问到默认主机,这时在nginx/logs目录下自动生成访问日志mysite.access.log和错误日志mysite.error.log。内容如下:
mysite.access.log内容:
访问日志的内容为main格式中定义的信息,某些信息不存在没有显示。我们也可以自定义访问日志的格式。
mysite.error.log内容:
可以看到错误原因是favicon.ico文件找不到,我们也可以知道错误发生的时间,请求,客户端和服务端IP等信息。
2.日志切片
上边我们已经知道怎么去设置访问日志和错误日志,但是这样设置有一个弊端:日志文件都放在同一个文件中,长时间运行后日志文件很大,可能达到几个G,甚至十几个G大小,查看起来很不方便。为了解决这个问题就需要进行日志切片,如每小时或者每天的日志放在一个单独的文件中。怎么实现呢?总体思路是:设置一个定时任务,每隔一段时间将日志文件剪切到一个特定的目录下。
这里以访问日志切片为例,为了方便演示这里把每分钟的访问日志放在一个单独的文件中,首先,添加一个存放日志文件的目录,执行命令 mkdir /usr/local/nginx/logs/mysitelogs ,我们打算把mysite的所有访问日志都放在这个文件夹下。然后添加一个切割日志的脚本,执行命令 vim /usr/local/nginx/mysitelog.sh ,脚本内容如下:
#mysite.com虚拟主机的日志存放路径 LOGPATH=/usr/local/nginx/logs/mysite.access.log #日志备份文件目录,mysite虚拟主机的备份日志放在logs下的单独目录下 BASEPATH=/usr/local/nginx/logs/mysitelogs #一分钟记录一次 bak=$BASEPATH/$(date -d today +%Y%m%d%H%M).mysite.access.log #重名日志文件 mv $LOGPATH $bak touch $LOGPATH #向nginx主进程发送信号,重新写日志 /usr/local/nginx/sbin/nginx -s reopen
最后添加一个定时任务,执行命令 crontab -e ,编辑内容如下,表示每分钟执行一次mysitelog.sh脚本:
* * * * * sh /usr/local/nginx/mysitelog.sh
到这里日志切片就结束了,我们看一个日志文件, cd /usr/local/nginx/logs/mysitelogs 到日志文件夹下,看到日志文件为每分钟存储一次,前缀格式为yyyyMMddhhmm:
补充:我们在实际使用时一般把一天的日志放在一个文件中(高并发量的除外),下边的脚本实现每天晚上11:30分存储一次日志文件:
#-------------------shell脚本 #该虚拟主机的日志存放路径 LOGPATH=/usr/local/nginx/logs/mysite.access.log #日志备份文件目录,mysite虚拟主机的备份日志放在logs下的单独目录下 BASEPATH=/usr/local/nginx/logs/mysitelogs #一天记录一次,格式为20190326mysite.access.log bak=$BASEPATH/$(date -d yesterday +%Y%m%d)mysite.access.log #重名日志文件 echo $bak mv $LOGPATH $bak touch $LOGPATH #向nginx主进程发送信号,重新打开日志 /usr/local/nginx/sbin/nginx -s reopen #------------------定时任务 30 23 * * * sh /usr/local/nginx/mysitelog.sh