其實已經有好長時間沒有寫博客,這次的博客主要強調兩點:一是日誌對於運維工作的重要性;
二是如何很好的管理服務器的日誌。博客主要從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、每天的日誌放在一個文件中,不需要一直往前翻,方便查閱;