一. 前提背景及需求
nginx運行日誌默認保存在nginx安裝目錄下的 /usr/local/nginx/logs 文件夾, 包含 access.log 和 error.log兩個文件.
(1) access.log 記錄了哪些用户、哪些頁面以及用户瀏覽器、ip和其他的訪問信息;
(2) error.log 則是記錄服務器錯誤日誌.
在所有時間內nginx產生的日誌均保存在同一個文件下, 隨着訪問量的增加,尤其是access.log增長極快,服務器會很快消耗磁盤空間,影響服務器效率。
另外,當需要對日誌文件裏面記錄的數據進行分析時,每次都要耗時很久才能下載這個龐大的日誌文件,浪費不必要的時間。
因此急需一個處理方案能夠自動化的實現按天或者按文件大小來切割nginx日誌記錄
二、linux下日誌切割
1. logrotate工具的介紹
logrotate是一個linux系統日誌的管理工具。可以對單個日誌文件或者某個目錄下的文件按時間/大小進行切割,壓縮操作;指定日誌保存數量;還可以在切割之後運行自定義命令。
logrotate是基於crontab運行的,所以這個時間點是由crontab控制的,具體可以查詢crontab的配置文件/etc/anacrontab。系統會按照計劃的頻率運行logrotate,通常是每天。在大多數的Linux發行版本上,計劃每天運行的腳本位於 /etc/cron.daily/logrotate。
主流Linux發行版上都默認安裝有logrotate包,如果你的linux系統中找不到logrotate, 可以使用apt-get或yum命令來安裝。
接下來,我們查看logrotate的配置文件
使用指令:rpm -ql logrotate
由下圖可知,logrotate的配置文件是 /etc/logrotate.conf, 這個文件用來定義全局默認參數。
其中, /etc/logrotate.d/ 存儲各種自定義應用的配置文件的目錄。該目錄裏的所有文件都會被主動的讀入到 /etc/logrotate.conf中執行。該目錄下的應用配置文件繼承所有/etc/logrotate.conf 的默認參數。因此我們可以新建一個針對nginx日誌文件的輪循配置的文件,然後將這個文件放在 /etc/logrotate.d/ 目錄下, 它就會主動的讀入到/etc/logrotate.conf中執行, 以達到按指定頻率定時執行的需求。
2. 創建nginx日誌分割文件 (路徑: /etc/logrotate.d/nginx )
新建nginx文件, 存放在 /etc/logrotate.d/ 文件夾下, 內容如下:
vim /etc/logrotate.d/nginx
/usr/local/nginx/logs/*.log {
daily
rotate 7
missingok
dateext
compress
delaycompress
notifempty
sharedscripts
postrotate
[ -e /usr/local/nginx/logs/nginx.pid ] && kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
endscript
}
- /usr/local/nginx/logs/*.log 需要輪詢/usr/local/nginx/logs 目錄下所有的日誌
- daily: 日誌文件分割頻度。可選值為 daily,monthly,weekly,yearly
- rotate 7: 一次將存儲7個歸檔日誌。對於第8個歸檔,時間最久的歸檔將被刪除。
- missingok: 在日誌輪循期間,任何錯誤將被忽略,例如“文件無法找到”之類的錯誤。
- dateext 使用日期作為命名格式
- compress: 在輪循任務完成後,已輪循的歸檔將使用gzip進行壓縮。
- nocompress: 如果你不希望對日誌文件進行壓縮,設置這個參數即可
- delaycompress: 總是與compress選項一起用,delaycompress選項指示logrotate不要將最近的歸檔壓縮,壓縮將在下一次輪循週期進行。這在你或任何軟件仍然需要讀取最新歸檔時很有用。
- notifempty: 如果日誌文件為空,輪循不會進行。
- sharedscripts 表示postrotate腳本在壓縮了日誌之後只執行一次
postrotate/endscript: 最通常的作用是讓應用重啓,以便切換到新的日誌文件, 在所有其它指令完成後,postrotate和endscript裏面指定的命令將被執行。在這種情況下,rsyslogd 進程將立即再次讀取其配置並繼續運行。
上述配置實現了一下功能:
1. 日誌按天分割
2. 保留最近7 天的日誌
3. 日誌以壓縮包的形式存儲,並且文件名稱以日期為後綴
一般情況下直接使用我的配置就可以,只需要將上述配置中的nginx.pid 文件的路徑修改成自己環境中的nginx.pid 文件路徑即可,這個路徑可以參考nignx.conf 中的pid 指令的配置,例如
如果有其他的需求,比如修改日誌的保留數或者是想要按照日誌的文件的大小來分割日誌也可以參考上述內容進行修改
測試:
手動執行logrotate
logrotate -f /etc/logrotate.d/nginx
查看nignx 日誌目錄:
添加定時任務
[root@localhost nginx-1.8.1]# rm -rf /etc/cron.daily/logrotate
[root@localhost nginx-1.8.1]# crontab -e
#Nginx logs cut
00 59 * * * /sbin/logrotate -f /etc/logrotate.d/nginx