Apache HTTP Server 版本2.2
說明 | 允許記錄日志和定制日志文件格式 |
---|---|
狀態(tài) | 基本(B) |
模塊名 | log_config_module |
源文件 | mod_log_config.c |
本模塊提供了靈活的方法將客戶請求記錄到日志。日志可以用自定義的格式直接寫入文件,或者傳送到一個外部程序繼續(xù)處理。條件日志功能可以實現(xiàn)根據(jù)請求的特征來決定一個日志信息是否被包含在最終的日志記錄里面。
本模塊提供了三個指令:TransferLog
指令用來指定日志文件,LogFormat
指令用來定義日志格式,CustomLog
指令可以同時完成指定日志文件和定義日志格式。TransferLog
和CustomLog
指令在每個服務(wù)器上都可以被多次使用,以便將同一個請求記錄到多個文件中。
LogFormat
和CustomLog
指令的格式化參數(shù)是一個字符串。這個字符串會在每次請求發(fā)生的時候,被記錄到日志中去。它可以包含將被原樣寫入日志的文本字符串以及C風(fēng)格的控制字符"\n"和"\t"以實現(xiàn)換行與制表。文本中的引號和反斜杠應(yīng)通過"\"來轉(zhuǎn)義。
請求本身的情況將通過在格式字符串中放置各種"%
"轉(zhuǎn)義符的方法來記錄,它們在寫入日志文件時,根據(jù)下表的定義進(jìn)行轉(zhuǎn)換:
格式字符串 | 描述 | ||||||
---|---|---|---|---|---|---|---|
%% | 百分號(Apache2.0.44或更高的版本) | ||||||
%a | 遠(yuǎn)端IP地址 | ||||||
%A | 本機(jī)IP地址 | ||||||
%B | 除HTTP頭以外傳送的字節(jié)數(shù) | ||||||
%b | 以CLF格式顯示的除HTTP頭以外傳送的字節(jié)數(shù),也就是當(dāng)沒有字節(jié)傳送時顯示'- '而不是0。 | ||||||
%{Foobar}C | 在請求中傳送給服務(wù)端的cookieFoobar的內(nèi)容。 | ||||||
%D | 服務(wù)器處理本請求所用時間,以微為單位。 | ||||||
%{FOOBAR}e | 環(huán)境變量FOOBAR的值 | ||||||
%f | 文件名 | ||||||
%h | 遠(yuǎn)端主機(jī) | ||||||
%H | 請求使用的協(xié)議 | ||||||
%{Foobar}i | 發(fā)送到服務(wù)器的請求頭Foobar: 的內(nèi)容。 | ||||||
%l | 遠(yuǎn)端登錄名(由identd而來,如果支持的話),除非IdentityCheck 設(shè)為"On ",否則將得到一個"-"。 | ||||||
%m | 請求的方法 | ||||||
%{Foobar}n | 來自另一個模塊的注解Foobar 的內(nèi)容。 | ||||||
%{Foobar}o | 應(yīng)答頭Foobar: 的內(nèi)容。 | ||||||
%p | 服務(wù)器服務(wù)于該請求的標(biāo)準(zhǔn)端口。 | ||||||
%P | 為本請求提供服務(wù)的子進(jìn)程的PID。 | ||||||
%{format}P | 服務(wù)于該請求的PID或TID(線程ID),format 的取值范圍為:pid 和tid (2.0.46及以后版本)以及hextid (需要APR1.2.0及以上版本) | ||||||
%q | 查詢字符串(若存在則由一個"? "引導(dǎo),否則返回空串) | ||||||
%r | 請求的第一行 | ||||||
%s | 狀態(tài)。對于內(nèi)部重定向的請求,這個狀態(tài)指的是原始請求的狀態(tài),---%>s 則指的是最后請求的狀態(tài)。 | ||||||
%t | 時間,用普通日志時間格式(標(biāo)準(zhǔn)英語格式) | ||||||
%{format}t | 時間,用strftime(3) 指定的格式表示的時間。(默認(rèn)情況下按本地化格式) | ||||||
%T | 處理完請求所花時間,以秒為單位。 | ||||||
%u | 遠(yuǎn)程用戶名(根據(jù)驗證信息而來;如果返回status(%s )為401,可能是假的) | ||||||
%U | 請求的URL路徑,不包含查詢字符串。 | ||||||
%v | 對該請求提供服務(wù)的標(biāo)準(zhǔn)ServerName 。 | ||||||
%V | 根據(jù)UseCanonicalName 指令設(shè)定的服務(wù)器名稱。 | ||||||
%X | 請求完成時的連接狀態(tài):
(在1.3以后的版本中,這個指令是 | ||||||
%I | 接收的字節(jié)數(shù),包括請求頭的數(shù)據(jù),并且不能為零。要使用這個指令你必須啟用mod_logio 模塊。 | ||||||
%O | 發(fā)送的字節(jié)數(shù),包括請求頭的數(shù)據(jù),并且不能為零。要使用這個指令你必須啟用mod_logio 模塊。 |
可以緊跟在"%"后面加上一個逗號分隔的狀態(tài)碼列表來限制記錄的條目。例如,"%400,501{User-agent}i
"只記錄狀態(tài)碼400和501發(fā)生時的User-agent
頭內(nèi)容;不滿足條件時用"-
"代替。狀態(tài)碼前還可以加上"!
"前綴表示否定,"%!200,304,302{Referer}i
"記錄所有不同于200,304,302的狀態(tài)碼發(fā)生時的Referer
頭內(nèi)容。
"<"和">"修飾符可以用來指定對于已被內(nèi)部重定向的請求是選擇原始的請求還是選擇最終的請求。默認(rèn)情況下,%s, %U, %T, %D, %r
使用原始請求,而所有其他格式串則選擇最終請求。例如,%>s
可以用于記錄請求的最終狀態(tài),而 %<u
則記錄一個已經(jīng)被內(nèi)部重定向到非認(rèn)證資源的請求的原始認(rèn)證用戶。
出于安全考慮,從2.0.46版本開始,%r
, %i
, %o
中的特殊字符,除了雙引號(")和反斜線(\)分別用 \"
和 \\
進(jìn)行轉(zhuǎn)義、空白字符用C風(fēng)格(\n
, \t
等)進(jìn)行轉(zhuǎn)義以外,非打印字符和其它特殊字符使用 \xhh
格式進(jìn)行轉(zhuǎn)義(hh是該字符的16進(jìn)制編碼)。在2.0.46以前的版本中,這些內(nèi)容會被完整的按原樣記錄。這種做法將導(dǎo)致客戶端可以在日志中插入控制字符,所以你在處理這些日志文件的時候要特別小心。
在2.0版本中(不同于1.3),%b
和 %B
格式字符串并不表示發(fā)送到客戶端的字節(jié)數(shù),而只是簡單的表示HTTP應(yīng)答字節(jié)數(shù)(在連接中斷或使用SSL時與前者有所不同)。mod_logio
提供的 %O
格式字符串將會記錄發(fā)送的實際字節(jié)數(shù)。
一些常見的格式串:
"%h %l %u %t \"%r\" %>s %b"
"%v %h %l %u %t \"%r\" %>s %b"
"%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\""
"%{Referer}i -> %U"
"%{User-agent}i"
說明 | 在將日志寫入磁盤前先在內(nèi)存中進(jìn)行緩沖 |
---|---|
語法 | BufferedLogs On|Off |
默認(rèn)值 | BufferedLogs Off |
作用域 | server config |
狀態(tài) | 基本(B) |
模塊 | mod_log_config |
兼容性 | 僅在 Apache 2.0.41 及以后的版本中可用 |
BufferedLogs
指令使得mod_log_config
先在內(nèi)存中緩沖一些日志內(nèi)容,然后一次性寫入磁盤,而不是立即寫入。在一些系統(tǒng)上這樣做可以提高磁盤性能。這個設(shè)置僅能夠針對全局進(jìn)行設(shè)置,不能單獨針對虛擬主機(jī)進(jìn)行設(shè)置。
說明 | 設(shè)定針對cookies的日志文件名 |
---|---|
語法 | CookieLog filename |
作用域 | server config, virtual host |
狀態(tài) | 基本(B) |
模塊 | mod_log_config |
兼容性 | 反對使用該指令 |
CookieLog
指令使用cookies作為日志文件名。文件是相對于ServerRoot
目錄的。包含本指令僅僅是為了保持與mod_cookies
模塊的兼容,并且反對使用。
說明 | 設(shè)定日志的文件名和格式 |
---|---|
語法 | CustomLog file|pipe format|nickname [env=[!]environment-variable] |
作用域 | server config, virtual host |
狀態(tài) | 基本(B) |
模塊 | mod_log_config |
CustomLog
指令用來對服務(wù)器的請求進(jìn)行日志記錄?梢灾付ㄈ罩镜母袷,也可以使用環(huán)境變量根據(jù)請求的特征來自由地組織日志。
第一個參數(shù)指定了日志記錄的位置,可以使用以下兩種方式來設(shè)定:
ServerRoot
的日志文件名。|
"后面緊跟著一個把日志輸出當(dāng)作標(biāo)準(zhǔn)輸入的處理程序路徑。
如果這里用到了程序,那么這個程序是以啟動httpd
的用戶來執(zhí)行的。因此如果啟動httpd的用戶是root ,那這個程序也將以root身份來運行;你需要確認(rèn)這個程序是安全的。
當(dāng)在非UNIX平臺上輸入文件路徑的時候,要特別注意即使平臺本身是使用反斜杠(\)來分隔路徑的,在這里也只能使用正斜杠(/)。通常在配置文件里只用正斜杠(/)來分隔路徑總是不會錯的。
第二個參數(shù)指定了寫入日志文件的內(nèi)容。它既可以是由前面的LogFormat
指令定義的nickname ,也可以是直接按日志格式一節(jié)所描述的規(guī)則定義的format字符串。
例如:以下兩組指令的結(jié)果是完全一樣的:
# 使用nickname
LogFormat "%h %l %u %t \"%r\" %>s %b" common
CustomLog logs/access_log common
# 明確使用格式格式字符串
CustomLog logs/access_log "%h %l %u %t \"%r\" %>s %b"
第三個參數(shù)是可選的,它根據(jù)服務(wù)器上特定的環(huán)境變量是否被設(shè)置來決定是否對某一特定的請求進(jìn)行日志記錄。如果這個特定的環(huán)境變量被設(shè)置(或者在"env=!name
"的情況下未被設(shè)置),那么這個請求將被記錄。
可以使用mod_setenvif
和/或mod_rewrite
模塊來為每個請求設(shè)置環(huán)境變量。例如:如果你想在服務(wù)器上將所有對GIF圖片的請求記錄在不同于主日志文件的另一個日志文件中,你可以使用下面的指令:
SetEnvIf Request_URI \.gif$ gif-image
CustomLog gif-requests.log common env=gif-image
CustomLog nongif-requests.log common env=!gif-image
或者為了復(fù)制舊有的RefererIgnore指令的行為,你可以使用下面的指令:
SetEnvIf Referer example\.com localreferer
CustomLog referer.log referer env=!localreferer
說明 | 定義訪問日志的記錄格式 |
---|---|
語法 | LogFormat format|nickname [nickname] |
默認(rèn)值 | LogFormat "%h %l %u %t \"%r\" %>s %b" |
作用域 | server config, virtual host |
狀態(tài) | 基本(B) |
模塊 | mod_log_config |
本指令定義訪問日志的記錄格式。
LogFormat
指令可以使用兩種定義格式中的一種。在第一種格式中,指令只帶一個參數(shù),以定義后續(xù)的TransferLog
指令定義的日志格式。這個唯一的參數(shù)可以按上述自定義日志格式小節(jié)所描述的format來定義。另外它也可以通過下述的方法使用nickname來引用某個之前的LogFormat
定義的日志格式。
第二種定義LogFormat
指令的格式中,將一個直接的format和一個nickname聯(lián)系起來。這樣在后續(xù)的LogFormat
或CustomLog
指令中,就不用一再重復(fù)整個冗長的格式串。定義別名的LogFormat
指令僅僅用來定義一個nickname ,而不做其它任何事情:也就是說,它只是定義了這個別名,它既沒有實際應(yīng)用這個別名,也不是把它設(shè)為默認(rèn)的格式。因此,它不會影響后續(xù)的TransferLog
指令。另外,LogFormat
不能用一個別名來定義另一個別名。注意,別名不能包含百分號(%
)。
LogFormat "%v %h %l %u %t \"%r\" %>s %b" vhost_common
說明 | 指定日志文件的位置 |
---|---|
語法 | TransferLog file|pipe |
作用域 | server config, virtual host |
狀態(tài) | 基本(B) |
模塊 | mod_log_config |
本指令除不允許直接定義日志格式或根據(jù)條件進(jìn)行日志記錄外,與CustomLog
指令有完全相同的參數(shù)和功能。實際應(yīng)用中,日志的格式是由最近的非別名定義的LogFormat
指令指定。如果沒有定義任何日志格式,則使用通用日志格式。
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\""
TransferLog logs/access_log