<-
Apache > HTTP Server > 文件 > 第 2.4 版 > 模組

Apache 模組 mod_log_config

可用的語言:  en  |  fr  |  ja  |  ko  |  tr 

說明記錄對伺服器的要求
狀態基本
模組識別碼log_config_module
原始檔案mod_log_config.c

摘要

此模組提供彈性記錄客戶端要求的功能。記錄採用可自訂的格式寫入,而且可以寫入檔案或外部程式。有提供條件化記錄,以便根據要求的特性納入或排除個別要求於記錄中。

此模組提供三條指令:TransferLog 用於建立記錄檔、LogFormat 用於設定自訂格式,以及 CustomLog 用於一步驟定義記錄檔和格式。可以在個別伺服器中多次使用 TransferLogCustomLog 指令,導致個別要求記錄在多個檔案中。

Support Apache!

主題

指令

修正錯誤檢查表

請見

top

自訂記錄格式

LogFormatCustomLog 指令的格式引數是字串。這個字串用於將個別要求記錄至記錄檔。這個字串可以包含複製到記錄檔的字元,以及 C 風格控制字元「\n」和「\t」來表示新行和標籤。字面上的引號和反斜線應以反斜線作跳脫。

請求本身的特性以將「%」指令置於格式字串中來記錄,這些指令在記錄檔中由值以下列方式取代

格式字串 說明
%% 百分比符號。
%a 請求的用戶端 IP 位址(請參閱 mod_remoteip 模組)。
%{c}a 連線的基礎對等 IP 位址(請參閱 mod_remoteip 模組)。
%A 本機 IP 位址。
%B 回應大小(以位元為單位),不含 HTTP 標頭。
%b 回應大小(以位元為單位),不含 HTTP 標頭。在 CLF 格式中,如果未傳送位元組則為「-」,而不會是 0。
%{VARNAME}C 傳送至伺服器的請求中,Cookie VARNAME 的內容。只有 0 版的 Cookie 獲得完全支援。
%D 處理請求所花費的時間(微秒)。
%{VARNAME}e 環境變數 VARNAME 的內容。
%f 檔案名稱。
%h 遠端主機名稱。如果 HostnameLookups 設為預設的 Off,則會記錄 IP 位址。如果它僅為少數幾個主機記錄主機名稱,則您可能擁有提及主機名稱的存取控制指令。請參閱 Require 主機文件
%{c}h %h 類似,但始終對基礎 TCP 連線的主機名稱進行報告,而不對 mod_remoteip 等模組對遠端主機名稱所做的任何修改進行報告。
%H 請求協定。
%{VARNAME}i 傳送至伺服器的請求中,標頭列 VARNAME: 的內容。由其他模組(例如 mod_headers)所做的變更會影響此內容。如果您有興趣瞭解大多數模組修改之前請求標頭的情況,請使用 mod_setenvif 將標頭複製到內部環境變數並使用上述 %{VARNAME}e 記錄該值。
%k 以此連線處理的 keepalive 請求數。如果正在使用 KeepAlive,則會很有趣。例如,「1」表示初始請求後的第一個 keepalive 請求、「2」表示第二個,依此類推;否則,這始終為 0(表示初始請求)。
%l 遠端登入名稱(來自 identd,如果已提供)。除非存在 mod_ident 且已將 IdentityCheck 設為 On,否則會傳回破折號。
%L 來自錯誤記錄的請求記錄 ID(或者如果沒有任何內容記錄在此請求的錯誤記錄中,則顯示「-」)。尋找相符的錯誤記錄列,以查看哪些請求導致哪個錯誤。
%m 請求方法。
%{VARNAME}n 來自另一個模組的註記 VARNAME 的內容。
%{VARNAME}o 回覆中標題行 VARNAME: 的內容。
%p 提供請求服務的伺服器的正規埠口。
%{格式}p 處理請求的伺服器的正規埠、伺服器的實際埠,或客戶端的實際埠。有效的格式為 cononicallocalremote
%P 處理請求的子程序的程序編號。
%{格式}P 處理請求的子程序的程序編號或執行緒編號。有效的格式為 pidtidhextid
%q 查詢字串(若有查詢字串則以 ? 開頭,否則為空字串)。
%r 請求的第一行。
%R 產生回應的處理常式(若有)。
%s 狀態。對於已內部重新導向的請求,這是原始請求的狀態。針對最終狀態,請使用 %>s
%t 收到請求的時間,格式為 [18/Sep/2011:19:18:28 -0400]。最後一個數字表示從 GMT 的時區偏移。
%{格式}t 時間,格式由格式決定,應為擴充的 strftime(3) 格式(有可能是本地的)。若格式以 begin: 開始(預設),則時間採自請求處理的開始。若以 end: 開始,則為日誌項目寫入的時間,接近請求處理的結束。除了 strftime(3) 支援的格式外,還支援以下格式化標記
sec自歷元以來經過的秒數
msec自歷元以來經過的毫秒數
usec自歷元以來經過的微秒數
msec_frac毫秒數部分
usec_frac微秒數部分
這些標記不可與彼此或 strftime(3) 格式組合使用,只要使用多個 %{格式}t 標記即可。
%T 處理請求花費的時間(以秒為單位)。
%{單位}T 處理請求所花費的時間,單位由 單位 決定。有效的單位有 ms(毫秒)、us(微秒)和 s(秒)。使用 s 會產生與不含任何格式的 %T 相同的結果;而 us 則會產生與 %D 相同的結果。將 %T 與單位結合使用的方式在 2.4.13 版之後才開始提供。
%u 如果請求已驗證,則為遠端使用者。如果傳回狀態(%s)為 401(未授權),則可能是偽造的。
%U 所請求的 URL 路徑,不含任何查詢字串。
%v 處理請求的伺服器的正規 ServerName
%V 根據 使用正規名稱 設定的伺服器名稱。
%X 回應完成時的連線狀態
X = 在回應完成之前,連線已中止。
+ = 在傳送回應之後,連線可能會繼續維持運作。
- = 回應傳送後,連線會中斷。
%I 收到的位元組,包含要求和標頭,不能為零。您需要啟用 mod_logio 模組才能使用此功能。
%O 已傳送的位元組,包括標頭。在某些罕見情況下,例如在傳送回應之前取消要求時,它可能會為零。您需要啟用 mod_logio 模組才能使用此功能。
%S 傳輸的位元組(收到的和已傳送的),包括要求和標頭,不能為零。這是 %I 和 %O 的組合。您需要啟用 mod_logio 模組才能使用此功能。
%{VARNAME}^ti 傳送到伺服器的要求中,VARNAME 行(會加上結尾字串)的內容。
%{VARNAME}^to 從伺服器傳送的回應中,VARNAME 行(會加上結尾字串)的內容。

修改器

個別項目可以限制僅列印特定 HTTP 狀態碼的回應,方法是在百分比符號後面加上狀態碼的逗號分隔清單。狀態碼清單前可以加上一個「!」來表示否定。

格式字串 含意
%400,501{User-agent}i 僅在 400 錯誤和 501 錯誤時記錄 User-agent。對於其他狀態碼,會記錄字串常數 "-"
%!200,304,302{Referer}i 傳回三個指定代碼之一的所有要求上記錄 Referer,否則記錄 "-"

對於已在內部重新導向以選擇應參照原始要求或最終要求的請求,可以使用修改器「<」和「>」。預設情況下,% 指令 %s、%U、%T、%D%r 會檢視原始要求,而所有其他指令則會檢視最終要求。因此,例如,%>s 可用於記錄要求的最終狀態,而 %<u 可用於記錄在內部重新導向到未驗證資源的請求(要求記錄)上的原始驗證使用者。

格式註解

由於安全性的考量,從 2.0.46 版開始,%r%i%o 中的非列印字元和其他特殊字元會使用 \xhh 順序來跳脫,其中 hh 代表原始位元的十六進制表示。此規則的例外情況是 "\,它們會透過在其前面加上反斜線來跳脫,以及所有空白字元,這些字元會以其 C 風格表示法撰寫 (\n\t 等)。在 2.0.46 版之前,這些字串未執行任何跳脫,因此您在處理原始記錄檔時必須非常小心。

自 httpd 2.0 後,不同於 1.3,格式字串 %b%B 並不代表傳送給客戶端的位元組數量,而是 HTTP 回應的位元組大小(例如,連線中斷或使用 SSL 時,其值會有所不同)。由 mod_logio 提供的格式 %O將記錄在網路上傳送的實際位元組數量

注意:mod_cache 是以快速處理常式而非標準處理常式實作。因此,當內容快取時,格式字串 %R 就不會傳回任何處理常式資訊。

範例

以下是幾個常用的記錄格式字串

常用記錄格式(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"
代理程式(瀏覽器)記錄格式
"%{User-agent}i"

可以使用 %{format}t 指令多次來建立時間格式,使用延伸格式代碼,例如 msec_frac

包含毫秒的時間戳記
"%{%d/%b/%Y %T}t.%{msec_frac}t %{%z}t"
top

安全性考量

如果存放記錄檔的目錄可寫入伺服器啟動使用者以外的任何使用者,請參閱安全性提示文件,瞭解詳細資訊,說明為什麼您的安全性會受到危害。

top

BufferedLogs 指令

說明在寫入磁碟前,將記錄項目緩存在記憶體中
語法BufferedLogs On|Off
預設值BufferedLogs Off
內容伺服器設定
狀態基本
模組mod_log_config

BufferedLogs 指令會導致 mod_log_config 將多個記錄項目儲存在記憶體中,並將它們一起寫入磁碟,而非在每個請求後寫入。在某些系統上,這樣可能使磁碟存取更有效率,因此效能更高。只能針對整個伺服器設定一次,無法針對每個虛擬主機設定。

使用此指令時應小心,因為當機可能會導致記錄資料遺失。
top

CustomLog 指令

說明設定記錄檔的檔名和格式
語法CustomLog file|pipe format|nickname [env=[!]environment-variable| expr=expression]
內容伺服器設定、虛擬主機
狀態基本
模組mod_log_config

CustomLog 指令用來記錄針對伺服器的請求。會指定記錄格式,而且可以選擇性地使用環境變數,根據請求特性來設定記錄條件。

第一個引數指定記錄的寫入位置,可以是下列兩種類型的值之一

file
相對於 ServerRoot 的檔案名稱。
pipe
管線字元「|」,後接接收標準輸入中日誌資訊程式的路徑。有關詳細資訊,請參閱 傳輸日誌 的注意事項。

安全性

如使用程式,則程式會以啟動 httpd 的使用者身分執行。如果伺服器是由 root 使用者啟動,則會是 root 使用者;請務必確保程式安全。

注意

在非 Unix 平台上輸入檔案路徑時,請小心確保僅使用正斜線,即使平台允許使用反斜線亦同。一般而言,最好在設定檔中始終使用正斜線。

第二個參數會指定會寫入至日誌檔的內容。它可以指定由先前 LogFormat 指令定義的 暱稱,也可以是如 日誌格式 區段中所述的明確 格式字串。

例如,以下兩組指令具有完全相同的效果

# CustomLog with format nickname
LogFormat "%h %l %u %t \"%r\" %>s %b" common
CustomLog "logs/access_log" common

# CustomLog with explicit format string
CustomLog "logs/access_log" "%h %l %u %t \"%r\" %>s %b"

第三個參數是選用的,用於控制是否記錄特定要求。條件可能是伺服器 環境 中是否存在特定變數(如果是「env=!名稱」子句,則為不存在)。或者,條件可以表示為任意布林 運算式。如果未滿足條件,則不會記錄要求。運算式中對於 HTTP 標頭的參照不會使標頭名稱會加入 Vary 標頭。

可以使用 mod_setenvif 和/或 mod_rewrite 模組,針對每個要求設定環境變數。例如,如果你要單獨將你伺服器上所有 GIF 影像的要求記錄在不同的日誌檔中,但不要記錄在你的主日誌檔中,你可以使用

SetEnvIf Request_URI \.gif$ gif-image
CustomLog "gif-requests.log" common env=gif-image
CustomLog "nongif-requests.log" common env=!gif-image

或者,若要複製舊 RefererIgnore 指令的行為,你可以使用下列指令

SetEnvIf Referer example\.com localreferer
CustomLog "referer.log" referer env=!localreferer
top

GlobalLog 指令

說明設定記錄檔的檔名和格式
語法GlobalLog檔案|管線 格式|暱稱 [env=[!]環境變數| expr=運算式]
內容伺服器設定
狀態基本
模組mod_log_config
相容性於 Apache HTTP Server 2.4.19 及更新版本提供

GlobalLog 指令定義主伺服器設定和所有已定義虛擬主機共用的日誌。

GlobalLog 指令與 CustomLog 指令相同,只有下列不同之處

top

LogFormat 指令

說明說明記錄檔檔案中使用的格式
語法LogFormat 格式|暱稱 [暱稱]
預設值LogFormat "%h %l %u %t \"%r\" %>s %b"
內容伺服器設定、虛擬主機
狀態基本
模組mod_log_config

此指令定義存取記錄檔的格式。

有兩種形式的 LogFormat 指令。第一種形式只有一個指定的參數,此指令會設定記錄格式,而後續中指定的各個 TransferLog 指令就會使用該格式記錄。這一個參數可以是 自訂記錄格式 區段前面已討論過的明確 格式。此外,也可以使用 暱稱 指涉 LogFormat 指令先前定義的記錄格式(如下描述)。

第二種形式的 LogFormat 指令是將明確的 格式暱稱 關聯起來。此 暱稱 可用於後續的 LogFormatCustomLog 指令,而非重複整個格式字串。LogFormat 指令定義暱稱只會有這一個作用,也就是 定義暱稱,它並未實際套用格式,或將其設為預設值。因此,它不會影響後續的 TransferLog 指令。此外,LogFormat 無法使用一個暱稱去定義另一個暱稱。請注意,暱稱不得包含百分比符號(%)。

範例

LogFormat "%v %h %l %u %t \"%r\" %>s %b" vhost_common
top

TransferLog 指令

說明指定記錄檔位置
語法TransferLog 檔案|管線
內容伺服器設定、虛擬主機
狀態基本
模組mod_log_config

此指令的參數和作用與 CustomLog 指令完全相同,唯一的例外是它不允許明确指定記錄格式,或有條件地記錄要求。記錄格式是由最近指定的 LogFormat 指令決定,此指令未定義暱稱。如果未指定其他格式,將會使用 common 日誌格式。

範例

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\""
TransferLog logs/access_log

可用的語言:  en  |  fr  |  ja  |  ko  |  tr 

top

意見

通知
這不是問與答區。張貼於此處的留言應針對改善文件或伺服器而提出建議,若留言已實作或被視為無效/離題,我們的管理員可能會予以刪除。有關如何管理 Apache HTTP 伺服器的問題,請至我們的 IRC 頻道 #httpd 上的 Libera.chat 提出,或寄送至我們的郵件清單