轉自 :http://blog.51cto.com/longlei/2095594
Apache日志詳解
1、Apache日志文件名稱及路徑介紹
當我們安裝並啟動Apache后,Apache會自動生成兩個日志文件,這兩個日志文件分別是訪問日志access_log(在Windows上是access.log)和錯誤日志error_log(在Windows上是error.log)。如果使用 SSL 服務的話,還可能存在 ssl_access_log和ssl_error_log 和 ssl_request_log 三種日志文件。
日志文件的路徑根據安裝方式不同位置也是不一樣的,一般都是在Apache安裝目錄的logs子目錄中,日志文件路徑可根據實際安裝情況在Apache的配置文件中進行查找。
https://blog.csdn.net/u013699800/article/details/37593491
2、Apache訪問日志格式詳解
訪問日志access_log記錄了所有對Web服務器的訪問活動,下面是訪問日志access_log中的一個標准記錄
192.168.115.5 - - [01/Apr/2018:10:37:19 +0800] "GET / HTTP/1.1" 200 45
日志字段所代表的內容如下:
1.遠程主機IP:表明訪問網站的是誰
2.空白(E-mail):為了避免用戶的郵箱被垃圾郵件騷擾,第二項就用“-”取代了
3.空白(登錄名):用於記錄瀏覽者進行身份驗證時提供的名字。
4.請求時間:用方括號包圍,而且采用“公用日志格式”或者“標准英文格式”。 時間信息最后的“+0800”表示服務器所處時區位於UTC之后的8小時。
5.方法+資源+協議:服務器收到的是一個什么樣的請求。該項信息的典型格式是“METHOD RESOURCE PROTOCOL”,即“方法 資源 協議”。
METHOD: GET、POST、HEAD、……
RESOURCE: /、index.html、/default/index.php、……(請求的文件)
PROTOCOL: HTTP+版本號
6.狀態代碼:請求是否成功,或者遇到了什么樣的錯誤。大多數時候,這項值是200,它表示服務器已經成功地響應瀏覽器的請求,一切正常。
7.發送字節數:表示發送給客戶端的總字節數。它告訴我們傳輸是否被打斷(該數值是否和文件的大小相同)。把日志記錄中的這些值加起來就可以得知服務器在一天、一周或者一月內發送了多少數據。
3、Apache訪問日志配置
(1)訪問日志格式分類
apache中日志記錄格式主要有兩種,普通型(common)和復合型(combined),安裝時默認使用普通型(common)類型日志記錄訪問信息,
(2)配置Apache訪問日志格式命令及參數
配置Apache訪問日志格式主要有兩個參數,即LogFormat指令和CustomLog指令
LogFormat指令:定義格式並為格式指定一個名字,以后我們就可以直接引用這個名字。
CustomLog指令:設置日志文件,並指明日志文件所用的格式(通常通過格式的名字)。
在apache的配置文件httpd.conf中,有幾行是這么配置的:
LogFormat "%h %l %u %t "%r" %>s %b" common 定義格式和名字
CustomLog "logs/access.log" common 普通文件記錄
%h |
%I |
%u |
%t |
%r |
%>s |
%b |
遠端主機 |
遠端登錄名 |
遠程用戶名 |
時間 |
請求第一行 |
狀態 |
傳送字節 |
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
CustomLog logs/access_log combined 復合日志記錄
%{Referer}i\ |
\"%{User-Agent}i\ |
請求來源 |
客戶端瀏覽器提供的瀏覽器識別信息 |
訪問日志文件的位置實際上是一個配置選項。如果我們檢查httpd.conf配置文件,可以看到該文件中有如下這行內容:
CustomLog /usr/local/apache/logs/access_log common
CustomLog指令指定了保存日志文件的具體位置以及日志的格式。上面這行指令指定的是common日志格式,自從有了Web服務器開始,common格式就是它的標准格式。
4、Apache錯誤日志格式詳解
錯誤日志的文件名字是error_log(Windows平台是error.log)。錯誤日志的位置可以通過ErrorLog指令設置:ErrorLog logs/error.log , 除非文件位置用根“/”開頭,否則這個文件位置是相對於ServerRoot目錄的相對路徑。
錯誤日志無論在格式上還是在內容上都和訪問日志不同。然而,錯誤日志和訪問日志一樣也提供豐富的信息,我們可以利用這些信息分析服務器的運行情況、哪里出現了問題。
錯誤日志記錄了服務器運行期間遇到的各種錯誤,以及一些普通的診斷信息,比如服務器何時啟動、何時關閉等。我們可以設置日志文件記錄信息級別的高低,控制日志文件記錄信息的數量和類型。這是通過LogLevel指令設置的,該指令默認設置的級別是error,即記錄稱得上錯誤的事件。有關該指令中允許設置的各種選項的完整清單,請參見http://www.apache.org/docs/mod/core.html#loglevel的Apache文檔。
我們在日志文件中見到的內容分屬兩類:文檔錯誤和CGI錯誤。但是,錯誤日志中偶爾也會出現配置錯誤,另外還有前面提到的服務器啟動和關閉信息。
(1)文檔錯誤
文檔錯誤和服務器應答中的400系列代碼相對應,最常見的就是404錯誤——Document Not Found(文檔沒有找到)。除了404錯誤以外,用戶身份驗證錯誤也是一種常見的錯誤。
404錯誤在用戶請求的資源(即URL)不存在時出現,它可能是由於用戶輸入的URL錯誤,或者由於服務器上原來存在的文檔因故被刪除或移動。 因此建議在不提供重定向或者其他補救措施的情況下,我們永遠不應該移動或者刪除Web網站的任何資源。 當用戶不能打開服務器上的文檔時,錯誤日志中出現的記錄如下所示:
[Fri Mar 30 14:45:09 2018] [error] [client 192.168.115.120]
File does not exist: /usr/local/apache/bugletdocs/Img/south-korea.gif
錯誤日志格式說明:
1.錯誤發生的日期和時間
2.錯誤的級別或嚴重性
3.導致錯誤的IP地址
4.錯誤信息本身。
可以看到,正如訪問日志access_log文件一樣,錯誤日志記錄也分成多個項。錯誤記錄的開頭是日期/時間標記,注意它們的格式和access_log中日期/時間的格式不同。access_log中的格式被稱為“標准英文格式”。
錯誤記錄的第二項是當前記錄的級別,它表明了問題的嚴重程度。這個級別信息可能是LogLevel指令的文檔中所列出的任一級別(參見前面LogLevel的鏈接),error級別處於warn級別和crit級別之間。404屬於error錯誤級別,這個級別表示確實遇到了問題,但服務器還可以運行。
錯誤記錄的第三項表示用戶發出請求時所用的IP地址。
記錄的最后一項才是真正的錯誤信息。對於404錯誤,它還給出了完整路徑指示服務器試圖訪問的文件。當我們料想某個文件應該在目標位置卻出現了404錯誤時,這個信息是非常有用的。此時產生這種錯誤的原因往往是由於服務器配置錯誤、文件實際所處的虛擬主機和我們料想的不同,或者其他一些意料不到的情況。
由於用戶身份驗證問題而出現的錯誤記錄如下所示:
[Fri Mar 30 14:53:15 2018] [error] [client 192.168.115.120]
user rbowen@rcbowen.com : authentication failure for "/cgi-bin/hirecareers/company.cgi" : password mismatch
注意:由於文檔錯誤是用戶請求的直接結果,因此它們在訪問日志中也會有相應的記錄。
(2)CGI錯誤
錯誤日志最主要的用途或許是診斷行為異常的CGI程序。為了進一步分析和處理方便,CGI程序輸出到STDERR(Standard Error,標准錯誤設備)的所有內容都將直接進入錯誤日志。這意味着,任何編寫良好的CGI程序,如果出現了問題,錯誤日志就會告訴我們有關問題的詳細信息。
然而,把CGI程序錯誤輸出到錯誤日志也有它的缺點,錯誤日志中將出現許多沒有標准格式的內容,這使得用錯誤日志自動分析程序從中分析出有用的信息變得相當困難。
下面是一個例子,它是調試Perl CGI代碼時,錯誤日志中出現的一個錯誤記錄:
[Web Mar 30 15:32:10 2018] [error] [client 192.168.115.120] Premature
end of script headers: /usr/local/apache/cgi-bin/HyperCalPro/announcement.cgi
Global symbol "$rv" requires explicit package name at
/usr/local/apache/cgi-bin/HyperCalPro/announcement.cgi line 81.
Global symbol "�tails" requires explicit package name at
/usr/local/apache/cgi-bin/HyperCalPro/announcement.cgi line 84.
Global symbol "$Config" requires explicit package name at
/usr/local/apache/cgi-bin/HyperCalPro/announcement.cgi line 133.
Execution of /usr/local/apache/cgi-bin/HyperCalPro/announcement.cgi
aborted due to compilation errors.
可以看到,CGI錯誤和前面的404錯誤格式相同,包含日期/時間、錯誤級別以及客戶地址、錯誤信息。但這個CGI錯誤的錯誤信息有好幾行,這往往會干擾一些錯誤日志分析軟件的工作。
有了這個錯誤信息,即使是對Perl不太熟悉的人也能夠找出許多有關錯誤的信息,例如至少可以方便地得知是哪幾行代碼出現了問題。Perl在報告程序錯誤方面的機制是相當完善的。當然,不同的編程語言輸出到錯誤日志的信息會有所不同。
由於CGI程序運行環境的特殊性,如果沒有錯誤日志的幫助,大多數CGI程序的錯誤都將很難解決。
有不少人在郵件列表或者新聞組中抱怨說自己有一個CGI程序,當打開網頁時服務器卻返回錯誤,比如“Internal Server Error”。我們可以肯定,這些人還沒有看過服務器的錯誤日志,或者根本不知道錯誤日志的存在。決多大多數情況下,錯誤日志能夠精確地指出CGI錯誤的所在以及如何修正這個錯誤。
5、查看服務器日志方法
在服務器維護時,經常會遇到各種錯誤,不斷地檢查服務器的日志,可以方便知道哪兒出了問題。用ssh遠程連接到服務器,然后輸入下面的命令,可以動態顯示錯誤日志后幾行內容,方便進行排錯。
tail -f /usr/local/apache/logs/error_log
無論具體采用的是哪一種方法,同時打開多個終端窗口都是一種好習慣:比如在一個窗口中顯示錯誤日志,在另一個窗口中顯示訪問日志。這樣,我們就能夠隨時獲知網站上發生的事情並立即予以解決。
6、Apache日志的定制
有時候我們需要定制Apache默認日志的格式和內容,比如增加或減少日志所記錄的信息、改變默認日志文件的格式等。
(1)定義日志格式及格式串變量含義詳解
定制日志文件的格式涉及到兩個指令,即LogFormat指令和CustomLog指令。默認httpd.conf文件提供了關於這兩個指令的幾個示例。
LogFormat指令:定義日志格式並為它指定一個名字,以后就可以直接引用這個名字。
CustomLog指令:設置日志文件,並指明日志文件所用的格式(通常通過格式的名字)。
LogFormat指令在默認的httpd.conf文件中,我們可以找到下面這行代碼:
LogFormat "%h %l %u %t \"%r\" %>s %b" common
該指令創建了一種名為“common”的日志格式,日志的格式在雙引號包圍的內容中指定。格式字符串中的每一個變量代表着一項特定的信息,這些信息按照格式串規定的次序寫入到日志文件。 Apache文檔已經給出了所有可用於格式串的變量及其含義,下面是其譯文:
%a: 遠程IP地址
%A: 本地IP地址
%B: 已發送的字節數,不包含HTTP頭
%b: CLF格式的已發送字節數量,不包含HTTP頭。例如當沒有發送數據時,寫入‘-’而不是0。
%{FOOBAR}e: 環境變量FOOBAR的內容
%f: 文件名字
%h: 遠程主機
%H 請求的協議
%Foobar}i: Foobar的內容,發送給服務器的請求的標頭行。
%l: 遠程登錄名字(來自identd,如提供的話)
%m: 請求的方法
%{Foobar}n: 來自另外一個模塊的注解“Foobar”的內容
%{Foobar}o: Foobar的內容,應答的標頭行
%p: 服務器響應請求時使用的端口
%P: 響應請求的子進程ID。
%q: 查詢字符串(如果存在查詢字符串,則包含“?”后面的部分;否則,它是一個空字符串。)
%r: 請求的第一行
%s: 狀態。對於進行內部重定向的請求,這是指*原來*請求的狀態。如果用%...>s,則是指后來的請求。
%t: 以公共日志時間格式表示的時間(或稱為標准英文格式)
%{format}t: 以指定格式format表示的時間
%T: 為響應請求而耗費的時間,以秒計
%u: 遠程用戶(來自auth;如果返回狀態(%s)是401則可能是偽造的)
%U: 用戶所請求的URL路徑
%v: 響應請求的服務器的ServerName
%V: 依照UseCanonicalName設置得到的服務器名字
分析前面來自默認httpd.conf文件的LogFormat指令示例,可以看出它創建了一種名為“common”的日志格式,其中包括:遠程主機,遠程登錄名字,遠程用戶,請求時間,請求的第一行代碼,請求狀態,以及發送的字節數。
LogFormat "%V %h %l %u %t \"%r\" %>s %b" common
【補充】"<"和">"修飾符可以用來指定對於已被內部重定向的請求是選擇原始的請求還是選擇最終的請求。默認情況下,%s, %U, %T, %D, %r 使用原始請求,而所有其他格式串則選擇最終請求。例如,%>s 可以用於記錄請求的最終狀態,而 %<u 則記錄一個已經被內部重定向到非認證資源的請求的原始認證用戶。
如果在“%”和變量之間放入了一個或者多個HTTP狀態代碼,則只有當請求返回的狀態代碼屬於指定的狀態代碼之一時,變量所代表的內容才會被記錄。例如,如果我們想要記錄的是網站的所有無效鏈接,那么可以使用:
LogFormat @4{Referer}i BrokenLinks
反之,如果我們想要記錄那些狀態代碼不等於指定值的請求,只需加入一個“!”符號即可:
LogFormat %!200U SomethingWrong
7、日志中記錄的相關信息說明
有許多信息可以用日志文件來記錄,其中包括:
(1)遠程機器的地址:“遠程機器的地址”和“誰在瀏覽網站”差不多,但並不等同。
(2)瀏覽時間:瀏覽者何時開始訪問網站?從這個問題的答案中我們能夠了解不少情況。從單個訪問記錄能夠得到的信息非常有限,但如果從數千個訪問記錄出發,我們就可以得到非常有用和重要的統計信息。
(3)用戶所訪問的資源:網站的哪些部分最受用戶歡迎?這些最受歡迎的部分就是我們應該繼續加以發展的部分。網站的哪些部分總是受到冷落?網站中這些受到冷落的部分或許隱藏得太深,或許它們確實沒有什么意思,此時我們就得想辦法加以改進。當然,網站還有的內容,比如法律上的聲明,雖然很少有人訪問,但卻不應該隨便地改動它們。
(4)無效鏈接:當然,日志文件還能夠告訴我們哪些東西不能按照我們所想象地運行。網站中是否存在錯誤的鏈接?其他網站鏈接過來時有沒有搞錯URL?是否存在不能正常運行的CGI程序?是否有搜索引擎檢索程序每秒發出數千個請求,從而影響了本網站的正常服務?這些問題的答案都可以從日志文件找到線索。