要了解一個web服務器的運行狀態,就得從日誌文件入手,Apache提供了很好的日誌控制機制給開發人員和運維人員使用。Apache中的日誌分爲兩種:一種是記錄apache運行錯誤的錯誤日誌,還有一種是運行過程中的訪問日誌。
錯誤日誌
錯誤日誌是由apache核心模塊mod_core提供的,用來記錄apache服務器產生的錯誤信息,比如:模塊裝載錯誤,CGI腳本錯誤等,通常這種日誌默認是打開的,你不必專門去維護錯誤日誌,因爲這種日誌一般很小。
ErrorLog
可以通過ErrorLog指令來指定錯誤日誌的存放位置,其格式如下:
ErrorLog file-path|syslog[:facility]
當file-path不是以“/”開頭時,指的是相對於ServerRoot目錄(conf和logs所在目錄)的文件名;如果是以"/"開頭,指的是存放錯誤文件的絕對路徑。
當file-path是以"|"開頭時,表示錯誤日誌需要通過管道先由一個程序來處理。
如果系統支持,你還可以用syslog替代文件名,採用系統日誌機制來記錄錯誤日誌。
LogLevel
還可以用LogLevel指令來指定錯誤級別,其格式如下:
LogLevel level
Apache中提供了8種level,分別是:
emerg:緊急(系統無法使用)
alert:必須立即採取措施
crit:致命情況
error:錯誤情況
warn:警告情況
notice:一般重要情況
info:普通信息
debug:調試信息
默認是warn,這時debug、info級別的日誌是不會記錄在日誌文件中的,如果是初期調試,可以設置爲debug便於排錯,線上環境還是用warn比較合理。
訪問日誌
訪問日誌是由apache的mod_log_config模塊來實現的,該模塊提供了三個指令:TransferLog指令用來指定日誌文件,LogFormat指令用來定義日誌格式,CustomLog指令可以同時完成指定日誌文件和定義日誌格式。TransferLog和CustomLog指令在每個服務器上都可以被多次使用,以便將同一個請求記錄到多個文件中。
LogFormat
其格式如下:
LogFormat format|nickname [nickname]
有兩種形式:
1、帶一個參數,供後面的TransferLog使用,如
LogFormat "%h %l %u %t \"%r\" %>s %b"
Transferlog logs/acccess_log
2、另一種是帶兩個參數,爲日誌格式起一個別名,供後面的CustomLog指令直接使用,如
LogFormat "%h %l %u %t \"%r\" %>s %b" common
CustomLog logs/acccess_log common
Logformat 指令參數請參考(http://www.phpchina.com/resource/manual/apache/mod/mod_log_config.html#formats)
CustomLog
其格式如下:
CustomLog file|pipe format|nickname [env=[!]environment-variable]
第一部分是一個文件名,也可以是一個管道(類似ErrorLog),第二部分是日誌格式,如果未指定則採用默認的日誌格式,第三部分是記錄日誌的條件,比如
SetEnvIf Request_URI \.gif$ gif-image
CustomLog gif-requests.log common env=gif-image
CustomLog nongif-requests.log common env=!gif-image
如果請求的是一個gif文件,則記錄到gif-requests.log文件中,否則記錄到nongif-requests.log文件中
TransferLog
其格式如下:
TransferLog file|pipe
與CustomLog類似,可以指定文件也可以指定管道,不同的是不能指定日誌格式,採用最近的LogFormat指令指定的日誌格式,如果沒有,則使用通用日誌格式。
實例分析
ErrorLog "|/opt/xxx/install/cronolog/sbin/cronolog /home/admin/yyy/logs/cronolog/%Y/%m/%Y-%m-%d-error_log"
LogLevel warn
LogFormat "%h %D %{X_READTIME}i %t \"%m http://%V%U%q\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
SetEnvIf Remote_Addr "127\.0\.0\.1" dontlog
SetEnvIf Request_URI "^/robots\.txt$" dontlog
SetEnvIf Request_URI "\.swf$" dontlog
SetEnvIf Request_URI "\.gif$" dontlog
SetEnvIf Request_URI "\.jpg$" dontlog
SetEnvIf Request_URI "\.ico$" dontlog
SetEnvIf Request_URI "\.jpeg$" dontlog
SetEnvIf Request_URI "\.bmp$" dontlog
SetEnvIf Request_URI "\.png$" dontlog
SetEnvIf Request_URI "\.js$" dontlog
SetEnvIf Request_URI "\.css$" dontlog
SetEnvIf Request_URI "\.wav$" dontlog
SetEnvIf Request_URI "\.swf$" dontlog
SetEnvIf Request_URI "home/css" dontlog
SetEnvIf Request_URI "/auction/auto/*" dontlog
SetEnvIf Request_URI "/auction/associate_categories.htm*" dontlog
SetEnvIf Request_URI "/auction/latest_visit.htm*" dontlog
CustomLog "|/opt/xxx/install/cronolog/sbin/cronolog /home/admin/cai/logs/cronolog/%Y/%m/%Y-%m-%d-xxx-access_log" combined env=!dontlog
可以得知:
1、錯誤日誌首先被管道程序cronolog處理,cronolog是一個開源工具,可以按照用戶自己的要求來隨意分割日誌文件(參考其官網:http://cronolog.org/),這裏是將錯誤文件按天分割,按年月來分目錄存儲。
2、日誌級別爲warn
3、定義了一個組合日誌格式,其別名叫combined
%h 遠端主機
%D 服務器處理本請求所用時間,以微秒爲單位
%{X_READTIME}i 訪問的時間點,格式爲04/Mar/2013:23:59:59
%t 時間,用普通日誌時間格式(標準英語格式)
%m 請求的方法 比如get/post
%V 根據UseCanonicalName指令設定的服務器名稱。
%U 請求的URL路徑,不包含查詢字符串。
%q 查詢字符串(若存在則由一個”?“引導,否則返回空串)
%>s 狀態碼
%b 以CLF格式顯示的除HTTP頭以外傳送的字節數,也就是當沒有字節傳送時顯示’-‘而不是0。
%{Referer}i 訪問來源
%{User-Agent}i 記錄客戶端信息,如操作系統、瀏覽器版本之類的
4、定義了一個變量dontlog,當請求地址中包含圖片、js腳本等信息時,這個變量有值
5、同錯誤日誌一樣,訪問日誌也被cronolog處理,採用的是combined定義的日誌格式且在dontlog不存在的時候才記錄。
1、http://httpd.apache.org/docs/trunk/logs.html