配置Tomcat的訪問日誌格式化輸出

博客搬家,本文新地址: http://www.zicheng.net/article/9
 
本文描述如何配置tomcat的訪問日誌,按咱們的要求輸出指定的日誌格式。
且在Nginx+Tomcat的配置環境中,如何讓Tomcat記錄訪客真實的IP地址
本文爲原創內容,轉載請註明出處: JDiy官網  http://jdiy.net/read.jsp?id=y0hab3qs03
 
在tomcat的server.xml文件中,host主機配置區域找到相似以下(紅色部分)即爲訪問日誌的配置:
 <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
       <!--...部份內容略..-->
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log." suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />
      </Host>
 
其中的directory用於指定日誌的存放路徑,默認位於tomcat的logs目錄中,例如咱們能夠修改爲:
directory="c:/wwwlogs" 使日誌放到c:\wwwlogs目錄中去。
其中的prefix和suffic分別用於指定日誌文件的前綴和後綴,不用我多說。
如今咱們主要來看一下pattern配置段,它用於指定日誌的輸出格式。有效的日誌格式模式能夠參見下面內容,以下字符串,其對應的信息由指定的響應內容取代:

    %a - 遠程IP地址
    %A - 本地IP地址
    %b - 發送的字節數,不包括HTTP頭,或「 - 」若是沒有發送字節
    %B - 發送的字節數,不包括HTTP頭
    %h - 遠程主機名
    %H - 請求協議
    %l (小寫的L)- 遠程邏輯從identd的用戶名(老是返回' - ')
    %m - 請求方法
    %p - 本地端口
    %q - 查詢字符串(在前面加上一個「?」若是它存在,不然是一個空字符串
    %r - 第一行的要求
    %s - 響應的HTTP狀態代碼
    %S - 用戶會話ID
    %t - 日期和時間,在通用日誌格式
    %u - 遠程用戶身份驗證
    %U - 請求的URL路徑
    %v - 本地服務器名
    %D - 處理請求的時間(以毫秒爲單位)
    %T - 處理請求的時間(以秒爲單位)
    %I (大寫的i) - 當前請求的線程名稱

此外,您能夠指定如下別名來設置爲廣泛使用的模式之一:

    common - %h %l %u %t "%r" %s %b
    combined - %h %l %u %t "%r" %s %b "%{Referer}i" "%{User-Agent}i" 

另外,還能夠將request請求的查詢參數、session會話變量值、cookie值或HTTP請求/響應頭內容的變量值等內容寫入到日誌文件。
它仿照了apache的語法:

    %{XXX}i xxx表明傳入的頭(HTTP Request)
    %{XXX}o xxx表明傳出​​的響應頭(Http Resonse)
    %{XXX}c  xxx表明特定的Cookie名
    %{XXX}r  xxx表明ServletRequest屬性名
    %{XXX}s xxx表明HttpSession中的屬性名
 
舉例說明:
  例如咱們在架設jsp服務器時,採用 Nginx+Tomcat這種配置時,將請求由Nginx轉發給Tomcat,當須要在tomcat的日誌中記錄來訪者的真實IP地址信息時,咱們就須要作一點點有別於其它的特殊匹配了,要否則tomcat記錄的訪客IP全都是127.0.0.1, 這是由於全部的請求都是由Nginx前端服務器轉發而來的,而前端服務器對於tomcat來講就是127.0.0.1。
 下面,咱們來看一下如何讓tomcat記錄用戶的真實IP地址:
 
1、配置Nginx轉發IP頭:
在Nginx的server主機配置段中添加:
proxy_set_header        Host $host; 
proxy_set_header        X-Real-IP $remote_addr;
說明:上面兩行用於向tomcat發送真實的遠端主機名和IP地址。其中的Host表明主機名, X-Real-IP表明主機IP,對於HTTP頭部內容,這些變量是不區分大小寫的。
 
2、配置Tomcat日誌記錄客戶真實IP:
在Tomcat中要記錄來訪者真實IP,你們參考上面所述的tomcat日誌配置語法,只需在日誌模式中添加以下模式就好了:%{X-Real-IP}i
以下面完整的Tomcat日誌配置段:
<Valve className="org.apache.catalina.valves.AccessLogValve" 
directory="c:/wwwlogs/" prefix="cluster." suffix=".log"
pattern="%{X-Real-IP}i %u %t %r %s %b" resolveHosts="false" />
 
注意:上兩兩處修改後,您應該從新啓動Nginx和Tomcat服務,以使您的修改生效。這樣,當有新的請求過來時,即可以在Tomcat日誌文件中記錄訪客的真實IP地址了。
 
=====================================以上爲轉載
本機配置(不帶nginx):
server.xml:
 <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"  
               prefix="localhost_access_log." suffix=".txt" 
               pattern="%h %l %u %t %r %s %b %D %{Cookie}i %{User-Agent}i %{a}r" 
               resolveHosts="false"/>
輸出:
127.0.0.1 - - [25/Feb/2013:11:57:29 +0800] GET /app_back/index.do?a=12345 HTTP/1.1 200 59847 688 JSESSIONID=5F171789DDF29AB377F68B52BB18884E; mysessionid=3af66463-79a3-4b6c-a4c5-e7cd39a0aead Mozilla/5.0 (Windows NT 5.1; rv:16.0) Gecko/20100101 Firefox/16.0 -
其中 url中的參數a能夠在url中顯示出來,可是post方式提交的request中的參數沒法記錄。
相關文章
相關標籤/搜索