nginx的日志文件沒有rotate功能。如果你不處理,日志文件將變得越來越大,還好我們可以寫一個nginx日志切割腳本來自動切割日志文件。
第一步就是重命名日志文件,不用擔心重命名后nginx找不到日志文件而丟失日志。在你未重新打開原名字的日志文件前,nginx還是會向你重命名的文件寫日志,linux是靠文件描述符而不是文件名定位文件。
第二步向nginx主進程發送USR1信號。
nginx主進程接到信號后會從配置文件中讀取日志文件名稱,重新打開日志文件(以配置文件中的日志名稱命名),並以工作進程的用戶作為日志文件的所有者。
重新打開日志文件后,nginx主進程會關閉重名的日志文件並通知工作進程使用新打開的日志文件。
工作進程立刻打開新的日志文件並關閉重名名的日志文件。
然后你就可以處理舊的日志文件了。
nginx日志按日期自動切割腳本如下
#nginx日志切割腳本
#!/bin/bash #設置日志文件存放目錄 logs_path="/usr/local/nginx/logs/" #設置pid文件 pid_path="/usr/local/nginx/nginx.pid" #重命名日志文件 mv ${logs_path}access.log ${logs_path}access_$(date-d"yesterday"+"%Y%m%d").log
#向nginx主進程發信號重新打開日志 kill -USR1 `cat ${pid_path}`
#以上是對日志的處理,可是重新命名后原來的那個access.log已經不存在了,使用tail -f 時候flumeng無法再繼續收集新產生的日志了,這個時候我們把flume收集日志的命令改為tail -F 收集日志即可。
詳細見 http://liyonghui160com.iteye.com/blog/2098777
保存以上腳本nginx_log.sh,設置定時執行。
設置上面的shell腳本文件加入到定時任務中去。crontab是linux下面一個定時任務進程。開機此進程會啟動,它每隔一定時間會去自己的列表中看是否有需要執行的任務。
crontab -e
0 0 * * * /data/wwwlogs/nginx_log_division.sh
會打開一個文件,加入上面的代碼
格式為 "分 時 日 月 星期幾 要執行的shell文件路徑"。用*可以理解成“每”,每分鍾,每個小時,每個月等等。
我設置是在凌晨0點0分運行nginx_log_division.sh腳本放到flume中bin文件夾下,腳本的內容就是重新生成一個新的日志文件。
nginx_log_division.sh代碼:
- #!/bin/bash
- #設置日志文件存放目錄
- logs_path="/usr/local/nginx/nginxlog/"
- #設置pid文件
- pid_path="/usr/local/nginx/nginx-1.7.3/logs/nginx.pid"
- #日志文件
- filepath=${logs_path}"access.log"
- # Source function library.
- #重命名日志文件
- mv ${logs_path}access.log ${logs_path}access_$(date -d '-1 day' '+%Y-%m-%d').log
- #向nginx主進程發信號重新打開日志
- kill -USR1 `cat ${pid_path}`
flumeng配置:
- # A single-node Flume configuration
- # Name the components on this agent
- agent1.sources = source1
- agent1.sinks = sink1
- agent1.channels = channel1
- # Describe/configure source1
- agent1.sources.source1.type = exec
- agent1.sources.source1.command = tail -n +0 -F /logs/access.log
- agent1.sources.source1.channels = channel1
- # Describe sink1
- agent1.sinks.sink1.type = file_roll
- agent1.sinks.sink1.sink.directory=/var/log/data
- # Use a channel which buffers events in memory
- agent1.channels.channel1.type = file
- agent1.channels.channel1.checkpointDir=/var/checkpoint
- agent1.channels.channel1.dataDirs=/var/tmp
- agent1.channels.channel1.capacity = 1000
- agent1.channels.channel1.transactionCapactiy = 100
- # Bind the source and sink to the channel
- agent1.sources.source1.channels = channel1
- agent1.sinks.sink1.channel = channel1