Apache學習筆記之日誌文件

要了解一個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指令指定的日誌格式,如果沒有,則使用通用日誌格式。


實例分析

httpd.conf中的有以下日誌文件配置
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

2、http://cronolog.org/


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