nginx泡得太久,日志就越來越大,有必要對其切割下,也便於按天統計訪問量神馬的。
沒啥難度,短短幾行的腳本即可
#!/bin/bash # Description: rotate nginx access logs NGX_PID=`cat /usr/local/nginx/logs/nginx.pid` LOGS_DIR="/home/wwwlogs" WWW_LOG_NAME="www.demo.com.log" B2B_LOG_NAME="b2b.demo.com.log" MOBILE_LOG_NAME="mobile.demo.com.log" PLIST_LOG_NAME="plist.demo.com.log" cd $LOGS_DIR /usr/bin/mv $WWW_LOG_NAME $(date +%F -d 'yesterday')_$WWW_LOG_NAME /usr/bin/mv $B2B_LOG_NAME $(date +%F -d 'yesterday')_$B2B_LOG_NAME /usr/bin/mv $MOBILE_LOG_NAME $(date +%F -d 'yesterday')_$MOBILE_LOG_NAME /usr/bin/mv $PLIST_LOG_NAME $(date +%F -d 'yesterday')_$PLIST_LOG_NAME /bin/kill -USR1 $NGX_PID
加到cron計划任務中
echo "0 0 * * * /home/scripts/rotate-nginx-logs.sh > /dev/null 2>&1" >> /var/spool/cron/root
=========================================================
2016-07-14
今天小伙伴給了我另一種更簡潔的方式,只要安裝logrotate這個軟件即可。
參考博客: http://www.pythondev.org/post/8.html
假如我們的安裝好的nginx日志路徑在/home/wwwlogs/,nginx進程PID路徑在/usr/local/nginx/logs/nginx.pid
yum install logrotate
安裝完成后,自動在/etc/cron.daily/下生成個logrotate腳本文件。
cd /etc/logrotate.d/
vim nginx 內容如下:
/home/wwwlogs/*log { su root www create 600 www www daily dateext rotate 10 missingok notifempty compress sharedscripts olddir /home/wwwlogs/oldlogs # 這個目錄要事先創建好,並給相關權限 postrotate kill -USR1 `cat /usr/local/nginx/logs/nginx.pid` endscript }
保存退出即可每天自動切割日志。
logrotate詳解:
logrotate 可以直接執行,后面跟配置文件就可以了,如:/usr/sbin/logrotate -f /etc/logrotate.d/nginx
參數:
-v 顯示指令執行過程
-d Debug模式(模擬執行),詳細顯示指令執行過程,便於排錯或了解程序執行的情況。
-f 強制執行
-s <狀態文件> 使用指定的狀態文件
logrotate 的默認配置文件是 /etc/logrotate.conf。主要參數:
daily指定轉儲周期為每天
weekly指定轉儲周期為每周
monthly指定轉儲周期為每月
dateext在文件末尾添加當前日期
compress通過gzip 壓縮轉儲以后的日志
nocompress不需要壓縮時,用這個參數
copytruncate先把日志內容復制到舊日志文件后才清除日志文件內容,可以保證日志記錄的連續性
nocopytruncate備份日志文件但是不截斷
create mode owner group轉儲文件,使用指定的文件模式創建新的日志文件
nocreate不建立新的日志文件
delaycompress和 compress 一起使用時,轉儲的日志文件到下一次轉儲時才壓縮
nodelaycompress覆蓋 delaycompress 選項,轉儲同時壓縮。
errors address專儲時的錯誤信息發送到指定的Email 地址
ifempty即使是空文件也轉儲,這個是 logrotate 的缺省選項。
notifempty如果是空文件的話,不轉儲
mail address把轉儲的日志文件發送到指定的E-mail 地址
nomail轉儲時不發送日志文件
olddir directory轉儲后的日志文件放入指定的目錄,必須和當前日志文件在同一個文件系統
noolddir轉儲后的日志文件和當前日志文件放在同一個目錄下
rotate count指定日志文件刪除之前轉儲的次數,0 指沒有備份,5 指保留5 個備份
tabootext [+] list讓logrotate 不轉儲指定擴展名的文件,缺省的擴展名是:.rpm-orig, .rpmsave, v, 和 ~
size size當日志文件到達指定的大小時才轉儲,Size 可以指定 bytes (缺省)以及KB (sizek)或者MB (sizem).
prerotate/endscript在轉儲以前需要執行的命令可以放入這個對,這兩個關鍵字必須單獨成行
postrotate/endscript在轉儲以后需要執行的命令可以放入這個對,這兩個關鍵字必須單獨成行
實例:
crontab -e
59 23 * * * /usr/sbin/logrotate -f /etc/logrotate.d/nginx # 把Nginx日志全部轉儲
vi /etc/logrotate.d/nginx
/var/log/nginx/*.log {
daily#指定轉儲周期為每天
missingok
rotate 52
compress#通過gzip 壓縮轉儲以后的日志
delaycompress#和 compress 一起使用時,轉儲的日志文件到下一次轉儲時才壓縮
ifempty
create 0640 www-data adm
sharedscripts
postrotate
#kill -USR1 `cat /var/run/nginx.pid不是中止Nginx的進程,而是傳遞給它信號重新生成日志,如果nginx沒啟動不做操作
[ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid`
endscript
}
Q&A
1.如何測試logrotate程序執行的情況
答:/usr/sbin/logrotate -d /etc/logrotate.d/nginx
2.怎么查看log文件的具體執行情況
答:cat /var/lib/logrotate/status
3.使用-v或-d參數時,顯示log does not need rotating
答:logrotate在對status未記錄的文件進行轉儲時,會在status添加一條該文件的記錄,並將操作時間設為當天。之后程序再次對此文件進行轉儲時發現這個文件今天已經操作過,就不再進行相關操作。
解決方法:1. vi /var/lib/logrotate/status 更改相對應的文件操作日期
2. 使用-s指定狀態文件
4.分割日志時報錯:error: skipping "/var/log/nginx/test.access.log" because parent directory has insecure permissions (It's world writable or writable by group which is not "root") Set "su" directive in config file to tell logrotate which user/group should be used for rotation.
答:添加“su root list”到/etc/logrotate.d/nginx文件中即可
如下;
/var/log/nginx/*.log {
su root list
daily
missingok
rotate 52
compress
delaycompress
notifempty
#ifempty
create 0640 www-data adm
sharedscripts
postrotate
[ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid`
endscript
}