Nginx 日志切割


:Mr.zhou  阅读: 2,237 次

默认情况下,Nginx 的访问日志保存在一个文件里。时间久了日志内容变得异常庞大。不利于日志文件的归档备份及分析。可以通过每天定时执行脚本来达到自动切割日志的目的,达到每天的访问日志保存在一个单独文件内。

为了切割日志,首先需要将已存在的日志重命名(默认访问日志为 access.log ,重命名为当天的日期),然后向 Nginx 的 master 进程发送 USR1 信号来使进程重新打开所有日志文件并设置日志文件的属主为 work 进程运行的用户,(此时由于 access.log 已被重命名 所以进程会新创建一个 access.log 并将属主改为 work 进程运行的用户,来记录新的访问日志)。当日志文件重新打开成功后,master 会关闭所有打开的日志文件,并通知 work 进程重新打开日志文件。work 进程以正确的方式关闭之前的日志文件,并使用新的日志文件记录。

未进行切割之前:

[root@lnmp www]# du -h access.log 
12M     access.log
[root@lnmp www]# head -n 1 access.log 
120.27.47.* - - [25/Sep/2015:10:35:31 +0800] "HEAD / HTTP/1.1" 200 0 "-" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)" "-"
[root@lnmp www]# tail -n 1 access.log       
112.126.75.* - - [29/Sep/2015:12:06:54 +0800] "HEAD / HTTP/1.1" 200 0 "-" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)" "-"
[root@lnmp www]# 

使用脚本重命名日志文件,并发送 USR1 信号给 Nginx master 进程。然后将脚本加入定时任务:

Nginx master 进程号文件保存位置:

[root@lnmp scripts]# grep pid /application/nginx/conf/nginx.conf
pid        logs/nginx.pid;
[root@lnmp scripts]# cat /application/nginx/logs/nginx.pid 
7039
[root@lnmp scripts]# 

配置文件中访问日志保存路径及文件名:

[root@lnmp scripts]# grep access /application/nginx/conf/website/www.conf
    access_log /data/logs/website/www/access.log  main;
[root@lnmp scripts]

脚本:

[root@lnmp scripts]# cat rotate-nginx-logs.sh 
#!/bin/bash
# Rotate nginx logs
# Nginx pid file : /application/nginx/logs/nginx.pid
# Nginx logs directory : /data/logs/website/www 
# Default log name : access.log
# Author : Mr.Zhou

NGX_PID=/usr/local/nginx/logs/nginx.pid
LOGS_DIR=/data/logs/website/
LOG_NAME=access.log
DATE=$(/bin/date +%F -d 'yesterday')

LOGS=$(/bin/find $LOGS_DIR -type f -name "$LOG_NAME")
for log in $LOGS
do
log_dir=$(/usr/bin/dirname $log)
old_log="${DATE}.$LOG_NAME"
cd $log_dir && /bin/mv $LOG_NAME $old_log
done
/bin/kill -USR1 $(cat $NGX_PID)
[root@lnmp scripts]# 

将脚本加入到定时任务,每天零点执行:

[root@lnmp scripts]# crontab -l
# rotate nginx log everyday
00 00 * * * /bin/bash /application/scripts/rotate-nginx-logs.sh &>/dev/null
[root@lnmp scripts]# 

定时任务自动执行切割脚本后:

[root@lnmp www]# ls
2015-09-29.access.log  access.log
[root@lnmp www]# tail -n 1 2015-09-29.access.log 
112.126.75.174 - - [29/Sep/2015:23:59:54 +0800] "HEAD / HTTP/1.1" 200 0 "-" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)" "-"
[root@lnmp www]# head -n 1 access.log                
45.119.97.12 - - [30/Sep/2015:00:00:31 +0800] "POST /wp-cron.php?doing_wp_cron=1443542431.7503929138183593750000 HTTP/1.0" 200 0 "-" "WordPress/4.3.1; http://www.z-dig.com" "-"
[root@lnmp www]# 


转载请注明原文链接:http://www.z-dig.com/nginx-log-cutting.html



正文部分到此结束