nginx日誌管理之logrotate

       其實已經有好長時間沒有寫博客,這次的博客主要強調兩點:一是日誌對於運維工作的重要性;

二是如何很好的管理服務器的日誌。博客主要從nginx的日誌展開講解,然後,通過logrotate工具

對日誌進行管理,避免日誌太大佔滿磁盤空間。


第一個部分:Nginx日誌

    nginx是當前互聯網中使用非常多的web服務,它能夠實現負載均衡、反向代理、緩存等等功能,

但我要是這些,並不是本篇的內容,本篇主要是介紹nginx的日誌。


日誌的格式:

語法:log_format name string....


例子:

log_format  combined  '$remote_addr - $remote_user [$time_loca]'
		      ' "$request" $status $body_bytes_sent '
		      ' "$http_referer" "$http_user_agent" '
log_format  proxy     '$http_x_forwarded_for - $remote_user [$time_local]'
		      ' "$request" $status $body_bytes_sent '
		      ' "$http_referer" "$http_user_agent" '


相關變量的解析:

---------------------------------------------------------------------

$remote_addr,$http_x_forwarded_for:記錄客戶端IP地址

---------------------------------------------------------------------

$remote_user:記錄客戶端用戶名稱

---------------------------------------------------------------------

$request:記錄請求的URL和HTTP協議

---------------------------------------------------------------------

$status:記錄請求狀態

---------------------------------------------------------------------

$body_bytes_sent:發送給客戶端的字節數,不包括響應頭的大小

---------------------------------------------------------------------

$bytes_sent:發送給客戶端的總字節數

---------------------------------------------------------------------

$connection:連接的序列號

---------------------------------------------------------------------

$connection_requests:當前通過一個連接獲得的請求數量

---------------------------------------------------------------------

$msec:日誌寫入時間,單位s,精度ms

---------------------------------------------------------------------

$http_referer:記錄從哪個頁面鏈接訪問過來的

---------------------------------------------------------------------

$http_user_agent:記錄客戶端瀏覽器相關信息

---------------------------------------------------------------------

$request_length:請求的長度(包括請求行,請求頭和請求正文)

---------------------------------------------------------------------

$request_time:請求處理時間

---------------------------------------------------------------------

$time_iso8601:ISO8601標準格式下的本地時間

---------------------------------------------------------------------

$time_local:通過日誌格式下的本地時間

---------------------------------------------------------------------


假設,此時有一個站點爲www.test.com,要將訪問這個站點的信息記錄到log中

http {

log_format  combined  '$remote_addr - $remote_user [$time_loca]'
		      ' "$request" $status $body_bytes_sent '
		      ' "$http_referer" "$http_user_agent" '

server {
	listen	80;
	server_name	www.test.com;
	root	/data/web/htdocs;
	index  index.php index.html index.htm;
	
	access_log	/var/log/nginx/test.access.log  combined;
	error_log	/var/log/nginx/test.error.log   error;	

	location ~ \.php$ {
		root /data/web/htdocs;
		fastcgi_pass 127.0.0.1:9000;
		fastcgi_index index.php;
		fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
		include fastcgi_params;
		}
	}
}


上面僅是一個例子,http段中只列出了定義訪問日誌的部分,其他部分沒有寫出


第二部分:logrotate管理日誌

       logrotate是一個日誌文件管理工具。用來把舊文件輪轉、壓縮、刪除,並且創建新的日誌文件。

我們可以根據日誌文件的大小、天數等來轉儲,便於對日誌文件管理,一般都是通過cron計劃任務來完成的。


logrotate的配置文件主要由logrotate.conf和logrotate.d下面的所有文件構成,用戶將自己的配置需求寫到配置文件中;然後,通過crontab來執行,執行的週期可以是daily,weekly。可以在/etc/cron.daily中進行查看

[root@bbs01 cron.daily]# ls
logrotate  makewhatis.cron  mlocate.cron  prelink  readahead.cron  tmpwatch


可以看到在cron.daily目錄中有logrotate,主要是執行了logrotate服務

#!/bin/sh

/usr/sbin/logrotate /etc/logrotate.conf >/dev/null 2>&1
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
    /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0


那我們如何知道,crontab在何時執行logrotate這個任務呢,在centos系統中,是由anacrontab自動執行的。配置中定義了每日,每週,每月執行任務的時間。

[root@bbs01 cron.daily]# vim /etc/anacrontab 
#period in days   delay in minutes   job-identifier   command
1       5       cron.daily              nice run-parts /etc/cron.daily
7       25      cron.weekly             nice run-parts /etc/cron.weekly
@monthly 45     cron.monthly            nice run-parts /etc/cron.monthly


以上就是logrotate整個的工作過程,那麼如何配置我們的logrotate呢?

先看一個我在線上的配置,主要是針對nginx做的。

# cat /etc/logrotate.d/nginx
/usr/local/nginx/logs/*.log {
    rotate 5
    daily
    dateext
    postrotate
        /bin/kill -USR1 $(cat /usr/local/nginx/logs/nginx.pid)
    endscript
    missingok
    compress
}

格式很簡單,先指定我們日誌所處的位置,還能支持匹配,然後就是一些特定參數了。


參數的解釋如下:

---------------------------------------------------------------------

compress:通過gzip 壓縮轉儲舊的日誌

---------------------------------------------------------------------

nocompress:不需要壓縮時,用這個參數

---------------------------------------------------------------------

copytruncate:用於還在打開中的日誌文件,把當前日誌備份並截斷

---------------------------------------------------------------------

nocopytruncate:備份日誌文件但是不截斷

---------------------------------------------------------------------

create mode owner group:使用指定的文件模式創建新的日誌文件

---------------------------------------------------------------------

nocreate:不建立新的日誌文件

---------------------------------------------------------------------

delaycompress:和 compress 一起使用時,轉儲的日誌文件到下一次轉儲時才壓縮

---------------------------------------------------------------------

dateext  切換後的日誌文件會附加上一個短橫線和YYYYMMDD格式的日期,沒有這個配置項會附加一個小數點加一個數字序號

---------------------------------------------------------------------

nodelaycompress:覆蓋 delaycompress 選項,轉儲同時壓縮。

---------------------------------------------------------------------

errors address:專儲時的錯誤信息發送到指定的Email 地址

---------------------------------------------------------------------

ifempty:即使是空文件也轉儲,這個是 logrotate 的缺省選項。

---------------------------------------------------------------------

notifempty:如果是空文件的話,不轉儲

---------------------------------------------------------------------

mail address:把轉儲的日誌文件發送到指定的E-mail 地址

---------------------------------------------------------------------

missingok:如果日誌文件丟失,繼續下一個轉儲,不發出錯誤信息

---------------------------------------------------------------------

nomail:轉儲時不發送日誌文件

---------------------------------------------------------------------

olddir directory:轉儲後的日誌文件放入指定的目錄,必須和當前日誌文件在同一個文件系統

---------------------------------------------------------------------

noolddir:轉儲後的日誌文件和當前日誌文件放在同一個目錄下

---------------------------------------------------------------------

prerotate/endscript:在轉儲以前需要執行的命令可以放入這個對,這兩個關鍵字必須單獨成行

---------------------------------------------------------------------

postrotate/endscript:在轉儲以後需要執行的命令可以放入這個對,這兩個關鍵字必須單獨成行

---------------------------------------------------------------------

sharedscripts:所有的日誌文件都輪轉完畢後統一執行一次腳本

---------------------------------------------------------------------

daily:指定轉儲週期爲每天

---------------------------------------------------------------------

weekly:指定轉儲週期爲每週

---------------------------------------------------------------------

monthly:指定轉儲週期爲每月

---------------------------------------------------------------------

rotate count:指定日誌文件刪除之前轉儲的次數,0 指沒有備份,5 指保留5 個備份

---------------------------------------------------------------------

size size:當日志文件到達指定的大小時才轉儲,Size 可以指定 bytes (缺省)以及KB (sizek)或

---------------------------------------------------------------------

prerotate/endscript

    在prerotate和endscript之間的行(他倆自己各佔一行),在日誌文件被輪轉之前並且有需要輪轉時,纔會執行。

    該指令只能用於log文件定義中。

---------------------------------------------------------------------

postrotate/endscript

    在prerotate和endscript之間的行,在日誌文件被輪轉之後執行。

    該指令只能用於log文件定義中。

---------------------------------------------------------------------

firstaction/endscript

    在firstaction和endscript之間的行,在輪轉所有匹配了通配符的日誌被輪轉之前,

    在prerotate執行之前,並且至少要有一個日誌需要被輪轉時,纔會執行。

    只能用於log文件定義中,如果腳本錯誤退出,就不再繼續往下進行。

---------------------------------------------------------------------

lastaction/endscript

    在lastaction和endscript之間的行,在輪轉了所有匹配的日誌後,在postrotate執行之後,

    並且至少要有一個日誌被輪轉了的情況下,纔會執行。

---------------------------------------------------------------------


我們可以手動去執行logrotate立即管理日誌,也可以等待crontab自動執行任務計劃

手動執行過程,可以加-f、-d參數,-f去強制執行,-d則是debug模式

例如:logrotate -f -d /etc/logrotate.d/nginx


使用logrotate管理nginx的日誌,優點在於:

1、不需要擔心日誌文件會將目錄塞滿,logrotate會保留特定個數文件;

2、每天的日誌放在一個文件中,不需要一直往前翻,方便查閱;


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章