1. 程式人生 > >apache開啟日誌記錄,access.log

apache開啟日誌記錄,access.log

apache執行時會記錄其處理的所有請求的相關資訊.同時,也會記錄在處理過程中發生異常狀況的相關資訊. 伺服器可以用多種格式將與請求相關的活動資訊記錄在多個日誌檔案中,不過卻只能記錄一份錯誤資訊. 關於活動記錄,它是在請求完成被處理後才會對日誌內容進行寫入.如一個大檔案的上傳,它是在檔案上傳完後才寫入日誌的.而錯誤資訊是在錯誤發生時就寫入.當然,錯誤的發生也是一瞬間的事.不會出現請求那種長時間處理. 有一種通用的顯示日誌的方式:CLF(common log format).格式是: "%h %l %u %t \"%r\" %>s %b" 但隨著發展,這種格式的內容不夠多,人們又組織了另一種格式: "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"" 它能記住請求的瀏覽器版本及其他客戶端軟體的名稱與版本等. Apache自帶有一個標準的日誌模組:mod_log_config.另外,Apache 2.0還帶有一個額外的模組:mod_logio.它是前者的加強版.而且在http://modules.apache.org的模組註冊區還有其它的第三方模組可供使用. 例如,我的Apache的httpd.conf檔案中有如下配置: ErrorLog "logs/error.log" LogLevel warn <IfModule log_config_module>     LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined     LogFormat "%h %l %u %t \"%r\" %>s %b" common     <IfModule logio_module>       LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio     </IfModule>     CustomLog "logs/access.log" common </IfModule> 在我的Apache安裝目錄下的logs目錄下有兩個檔案,就是上面配置的error.log和access.log 上面的配置先定義了Apache錯誤資訊的日誌輸出.並定義了日誌輸出的等級.等級有如下幾種:
 等級名稱 介紹 
emerg  緊急狀況;伺服器無法使用 
alert  必須立刻採取動作 
 crit 危急狀況 
 error 出現錯誤 
 warn 警告 
 notice 正常,但有情況要注意 
 info 普通訊息 
 debug 除錯級別資訊,包括模組執行狀態
設定一個等級後,日誌檔案中會記錄它,以及它以上等級的日誌.但不管設定為可值,永遠都會記錄notice等級的資訊. 日誌中格式字串:
格式字串 描述
%% 百分號(Apache2.0.44或更高的版本)
%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的取值範圍為:pidtid(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 根據UserCanonicalName指令設定的伺服器名稱。
%X 請求完成時的連線狀態:
X= 連線在應答完成前中斷。
+= 應答傳送完後繼續保持連線。
-= 應答傳送完後關閉連線。

(在1.3以後的版本中,這個指令是%c,但這樣就和過去的SSL語法:%{var}c衝突了)

%I 接收的位元組數,包括請求頭的資料,並且不能為零。要使用這個指令你必須啟用mod_logio模組。
%O 傳送的位元組數,包括請求頭的資料,並且不能為零。要使用這個指令你必須啟用mod_logio模組。
按照日或小時記錄請求日誌 ====================================== 使用CustomLog及rotatelogs(已經在apache的bin目錄下包含:rotatelogs.exe.linux下目錄可能不同): CustomLog "| bin/rotatelogs logs/access_log.%Y-%m-%d 86400" combined 該配置會將日誌輸出到另一程式,而非檔案.即:rotatelogs.exe.這樣,我們就可以在不重啟Apache的情況下來生成新的檔案.該指令碼會在指定時間自動開啟新檔案,並寫入日誌. rotatelogs第一個引數是日誌檔案的檔案路徑和名:logs/access_log.%Y-%m-%d 86400 如果它包含有一個以上的%字元,則會被作為strftime(3)的格式字串來處理;如上面的格式表示年月晶.否則,一個十位數長的更新時間( 秒為單位)會被附加到檔名上.如:若檔名為foo,則會產生如foo.1234567890的日誌檔案.而上面的檔案則會產生:access_log.2011-04-25這樣的檔案. 第二個引數是兩次更新時間的間隔(以秒為單位).當系統時間是此引數值的倍數時,它就會產生更新操作.如,一天有86400秒,若設定此境遇早每天午夜就會產生新的日誌檔案. 每月第一天更新日誌檔案 ====================================== 同樣,也是用指令碼來處理,不過是使用:rotate-log-monthly.pl來處理.但這個指令碼不包括在apache安裝包中,我們需要自己下載.格式如下: CustomLog "| rotate-log-monthly.pl logs/access_log-%Y-%M" CLF 記錄主機名而非IP地址 ====================================== CustomLog "| bin/logresolve -c >> log/access_log.resolved" combined logresolve 已經在bin下包括.