如何针对nginx去做日志管理和日志分割
概述
不管什么程序,一般都会有日志的。哪怕你在浏览器上网访问了一个网站,也会有记录保存的。在我们平时解决报错过程中,查看日志往往是解决问题的重要方式,今天主要讲讲nginx的日志管理和设置定时任务去对nginx做日志分割。
Nginx日志描述
通过访问日志,你可以得到用户地域来源、跳转来源、使用终端、某个URL访问量等相关信息;通过错误日志,你可以得到系统某个服务或server的性能瓶颈等。因此,将日志好好利用,你可以得到很多有价值的信息。
参数明细表:
Nginx日志分割
nginx的日志文件没有rotate功能,不过我们也可以自己写一个nginx日志切割脚本来自动切割日志文件。
第一步就是重命名日志文件,这样就不用担心重命名后nginx找不到日志文件而丢失日志。在你未重新打开原名字的日志文件前,nginx还是会向你重命名的文件写日志,Linux是靠文件描述符而不是文件名定位文件。
第二步向nginx主进程发送USR1信号。nginx主进程接到信号后会从配置文件中读取日志文件名称,重新打开日志文件(以配置文件中的日志名称命名),并以工作进程的用户作为日志文件的所有者。重新打开日志文件后,nginx主进程会关闭重名的日志文件并通知工作进程使用新打开的日志文件。工作进程立刻打开新的日志文件并关闭重名名的日志文件。然后你就可以处理旧的日志文件了。[或者重启nginx服务]。
Nginx日志格式
打开nginx.conf配置文件:vim /usr/local/nginx/conf/nginx.conf
查看Nginx的nginx.conf文件,可以看到这样一条信息
#access_log logs/access.log main;
这说明该server访问日志的文件是 logs/host.access.log,使用的格式”main”格式。
日志生成的到Nginx根目录logs/access.log文件,默认使用“main”日志格式,也可以自定义格式。
main格式
#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地址; $remote_user 客户端用户名; $time_local 访问的时间和时区; $request 访问请求的类型,POST或者GET; $status 记录请求状态,404、304、200等等; $body_bytes_sent 客户端给服务器发送的文件主体内容的大小; $http_referer 访问来源——从哪个链接过来的; $http_user_agent 用户代理信息,一般是浏览器的标记,有时候也是爬虫标记。 $http_x_forwarded_for 直接访问该服务器的IP地址,可能是客户端IP也可能是代理服务器IP
除了main格式,你可以自定义其他格式,只需要把上述参数重新组合即可。
定时任务完成日志切割
1、创建一个日志切割的脚本
vi /usr/local/nginx/conf/runlog.sh(创建一个脚本为runlog.sh的脚本,路径位置为/usr/local/nginx/data/runlog.sh)在里面写入脚本
记得最后一行的“-SIGUSR1”命令根据操作系统不同使用会有所差异,所以需要查询自己的系统是不是这样写的。使用命令kill -l就可以看到支持那些命令。
脚本说明:定义日志存放路径,然后计算今天的日期确定存放的目录,然后将这个目录创建出来。然后再根据“时和分”计算出日志名称(存放在那个目录下)。然后将日志移动到文件夹中。然后创建一个新的空日志文件,下次创建日志的时候,里面是重新开始记录日志的。
2、创建一个定时器
Crontab -e 01 00 * * * /xxx/path/b.sh 每天0时1分(建议在02-04点之间,系统负载小)
这样日志就会每天定时备份到指定位置中去。
小技巧:一般手动切割日志查看具体信息可以这样写:
tail -n 30000 logs/catalina.out > a.txt (截取后3万行日志,保存到a.txt中)
上面核心其实1个就是理解下main格式的一些参数,然后自己去对应修改就行,另一个就是做下日志分割,大家有空也可以自己测试一下。后面会分享更多devops和DBA方面内容,感兴趣的朋友可以关注下!!