Apache提供了不把日誌直接寫入檔案,而是通過管道發送給另外一個程式的能力。這樣就大大加強了對日誌進行處理的能力。這個通過管道得到的程式可以是任意程式,如日誌分析、壓縮日誌等。要實現將日誌寫到管道的操作,只需要將設定中日誌檔案部分的內容替換爲"|程式名"即可,例如: compressed logs
CustomLog "|/usr/bin/gzip -c >> /var/log/access_log.gz" common
使用Apache自帶的輪循工具rotatelogs來對日誌檔案進行輪循。rotatelogs基本是按時間或大小來控制日誌的
在apache的組態檔httpd.conf裡一般都有類似於LogFormat 「%h %l %u %t 「%r」 %>s %b 「%{Referer}i」 「%{User-Agent}i」」 common 的日誌記錄格式設定,那麼這種格式裡的各個參數都代表什麼意思呢,怎樣設定才能 纔能完全掌握網站的存取情況呢?下面 下麪我結合具體的情況來講解一下:
在apache的組態檔httpd.conf中找到
ErrorLog logs/error_log及CustomLog logs/access_log common
將其改爲
ErrorLog "|/usr/sbin/rotatelogs /var/log/httpd/error_log-%Y%m%d 86400 480"
CustomLog "|/usr/sbin/rotatelogs /var/log/httpd/acc_log%Y%m%d 86400 480" combined
注意:這裏網上很多資料說的是老的Apache,沒有加上/usr/sbin/rotatelogs,這樣系統找不到執行的指令碼檔案,會造成無法啓動。
其中common爲日誌記錄格式裡設定的名稱。
若有多個站點,則應將以上設定寫到各站點的VirtualHost節點中,這樣纔會分開檔案記錄各站點日誌。
附rotatelogs說明
語法:
rotatelogs [ -l ] logfile [ rotationtime [ offset ]] | [ filesizeM ]
選項:
-l
選項
logfile
它加上基準名就是日誌檔名。如果logfile中包含’%’,則它會被視爲用於的strftime(3)的格式字串;否則,它會被自動加上以秒爲單位的.nnnnnnnnnn後綴。這兩種格式都表示新的日誌開始使用的時間。
rotationtime
日誌檔案回捲的以秒爲單位的間隔時間,86400 表示一天,即每天生成一個新的日誌檔案。
offset
相對於UTC的時差的分鐘數。如果省略,則預設爲0,並使用UTC時間。比如,要指定UTC時差爲-5小時的地區的當地時間,則此參數應爲-300,北京時間爲+8時間,應設定爲480。這樣日誌裡的時間纔會和伺服器上的時間一致,方便檢視日誌。
filesizeM
指定回捲時以兆位元組爲單位的後綴字母M的檔案大小,而不是指定回捲時間或時差。
比如剛纔的設定可以改爲每5M生成一個新檔案
ErrorLog "|/usr/sbin/rotatelogs /var/log/httpd/error_log-%Y%m%d 5M"
Apache文件已經給出了所有可用於格式串的變數及其含義,下面 下麪是其譯文:
請求本身的情況將通過在格式字串中放置各種"%"跳脫符的方法來記錄,它們在寫入日誌檔案時,根據下表的定義進行轉換:
%a 遠端IP地址
%A 本機IP地址
%B 除HTTP頭以外傳送的位元組數
%b 以CLF格式顯示的除HTTP頭以外傳送的位元組數,也就是當沒有位元組傳送時顯示’-'而不是0。
%{Foobar}C 在請求中傳送給伺服器端的cookieFoobar的內容。
%D 伺服器處理本請求所用時間,以微爲單位。
%{FOOBAR}e 環境變數FOOBAR的值
%f 檔名
%h 遠端主機
%H 請求使用的協定
%{Foobar}i 發送到伺服器的請求頭Foobar:的內容。
%l 遠端登錄名(由identd而來,如果支援的話),除非IdentityCheck設爲"On",否則將得到一個"-"。
%m 請求的方法
%{Foobar}n 來自另一個模組的註解Foobar的內容。
%{Foobar}o 應答頭Foobar:的內容。
%p 伺服器服務於該請求的標準埠。
%P 爲本請求提供服務的子進程的PID。
%{format}P 服務於該請求的PID或TID(執行緒ID),format的取值範圍爲:pid和tid(2.0.46及以後版本)以及hextid(需要APR1.2.0及以上版本)
%q 查詢字串(若存在則由一個"?"引導,否則返回空串)
%r 請求的第一行
%s 狀態。對於內部重定向的請求,這個狀態指的是原始請求的狀態,—%>s則指的是最後請求的狀態。
%t 時間,用普通日誌時間格式(標準英語格式)
%{format}t 時間,用strftime(3)指定的格式表示的時間。(預設情況下按在地化格式)
%T 處理完請求所花時間,以秒爲單位。
%u 遠端使用者名稱(根據驗證資訊而來;如果返回status(%s)爲401,可能是假的)
%U 請求的URL路徑,不包含查詢字串。
%v 對該請求提供服務的標準ServerName。
%V 根據UseCanonicalName指令設定的伺服器名稱。
%X 請求完成時的連線狀態:X= 連線在應答完成前中斷。
+= 應答傳送完後繼續保持連線。
-= 應答傳送完後關閉連線。
(在1.3以後的版本中,這個指令是%c,但這樣就和過去的SSL語法:%{var}c衝突了)
%I 接收的位元組數,包括請求頭的數據,並且不能爲零。要使用這個指令你必須啓用mod_logio模組。
%O 發送的位元組數,包括請求頭的數據,並且不能爲零。要使用這個指令你必須啓用mod_logio模組。
修飾符
可以緊跟在"%「後面加上一個逗號分隔的狀態碼列表來限制記錄的條目。例如,」%400,501{User-agent}i" 只記錄狀態碼400和501發生時的User-agent頭內容;不滿足條件時用"-「代替。狀態碼前還可以加上」!「字首表示否 定,」%!200,304,302{Referer}i"記錄所有不同於200,304,302的狀態碼發生時的Referer頭內容。
"<「和」>"修飾符可以用來指定對於已被內部重定向的請求是選擇原始的請求還是選擇最終的請求。預設情況下,%s, %U, %T, %D, %r 使用原始請求,而所有其他格式串則選擇最終請求。例如,%>s 可以用於記錄請求的最終狀態,而 %<u 則記錄一個已經被內部重定向到非認證資源的請求的原始認證使用者。
一些說明
出於安全考慮,從2.0.46版本開始,%r, %i, %o 中的特殊字元,除了雙引號(")和反斜線()分別用 " 和 \ 進行跳脫、空白字元用C風格(\n, \t 等)進行跳脫以外,非列印字元和其它特殊字元使用 \xhh 格式進行跳脫(hh是該字元的16進位制編碼)。在2.0.46以前的版本中,這些內容會被完整的按原樣記錄。這種做法將導致用戶端可以在日誌中插入控制字 符,所以你在處理這些日誌檔案的時候要特別小心。
在2.0版本中(不同於1.3),%b 和 %B 格式字串並不表示發送到用戶端的位元組數,而只是簡單的表示HTTP應答位元組數(在連線中斷或使用SSL時與前者有所不同)。mod_logio提供的 %O 格式字串將會記錄發送的實際位元組數。
範例
一些常見的格式串:
通用日誌格式(CLF)
「%h %l %u %t 「%r」 %>s %b」
帶虛擬主機的通用日誌格式
「%v %h %l %u %t 「%r」 %>s %b」
NCSA擴充套件/組合日誌格式
「%h %l %u %t 「%r」 %>s %b 「%{Referer}i」 「%{User-agent}i」」
Referer日誌格式
「%{Referer}i -> %U」
Agent(Browser)日誌格式
「%{User-agent}i」
在所有上面列出的變數中,「…」表示一個可選的條件。如果沒有指定條件,則變數的值將以「-」取代。分析前面來自預設httpd.conf檔案的 LogFormat指令範例,可以看出它建立了一種名爲「common」的日誌格式,其中包括:遠端主機,遠程登錄名字,遠端使用者,請求時間,請求的第一 行程式碼,請求狀態,以及發送的位元組數。
有時候我們只想在日誌中記錄某些特定的、已定義的資訊,這時就要用到「…」。如果在「%」和變數之間放入了一個或者多個HTTP狀態程式碼,則只有當請 求返回的狀態程式碼屬於指定的狀態程式碼之一時,變數所代表的內容纔會被記錄。例如,如果我們想要記錄的是網站的所有無效鏈接,那麼可以使用:
LogFormat %404{Referer}i BrokenLinks
反之,如果我們想要記錄那些狀態程式碼不等於指定值的請求,只需加入一個「!」符號即可:
LogFormat %!200U SomethingWrong
專門記錄某個蜘蛛記錄
SetEnvIfNoCase User-Agent Baiduspider baidu_robot
LogFormat 「%h %t \」%r\」 %>s %b」 robot
linux下
CustomLog 「|/usr/local/apache2.2.0/bin/rotatelogs /usr/local/apache2.2.0/logs/baidu_%Y%m%d.txt 86400 480″ robot env=baidu_robot
windows下
CustomLog 「|bin/rotatelogs.exe logs/baidu_%Y%m%d.txt 86400 480″ robot env=baidu_robot
這樣在logs目錄下,就會每天產生baidu_年月日.txt的日誌了,每條的記錄和下面 下麪的類似:
61.135.168.14 [22/Oct/2008:22:21:26 +0800] 「GET / HTTP/1.1″ 200 8427
從上面的參數設定中,我們會使用到strftime(3)指定的格式
%A 星期名全稱(原生的)
%a 3個字元的星期名(原生的)
%B 月份名的全稱(原生的)
%b 3個字元的月份名(原生的)
%c 日期和時間(原生的)
%d 2位數的一個月中的日期數
%H 2位數的小時數(24小時制)
%I 2位數的小時數(12小時制)
%j 3位數的一年中的日期數
%M 2位數的分鐘數
%m 2位數的月份數
%p am/pm12小時制的上下午(原生的)
%S 2位數的秒數
%U 2位數的一年中的星期數(星期天爲一週的第一天)
%W 2位數的一年中的星期數(星期一爲一週的第一天)
%w 1位數的星期幾(星期天爲一週的第一天)
%X 時間(原生的)
%x 日期(原生的)
%Y 4位元數的年份
%y 2位數的年份
%Z 時區名
%% 符號"%"本身
我們可以看出這些和傳統的還是有所區別的,比如我們在PHP中使用格式化時間,使用的是
Y-m-d H:i:s
但這裏是沒有i和s的,必須使用%I和%S ,我們來看一下預設的日誌
這是系統的格式,我們想按中國人的習慣,那就改爲
LogFormat "%a %h %l %u %{%Y-%m-%d %H:%M:%S}t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%a %h %l %u %{%Y-%m-%d %H:%M:%S}t \"%r\" %>s %b" common
重新啓動動Apache後來看一下
OK,一切搞定!