對於nginx+tomcat這種架構,如果後端tomcat配置保持默認,那麼tomcat的訪問日誌裏,記錄的就是前端nginx的IP地址,而不是真實的訪問IP。因此,需要對nginx、tomcat做如下配置:
1)nginx配置
......
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
......
2)tomcat配置
......
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="/data/logs/tomcat"
prefix="search_access" suffix=".log"
pattern="%{X-FORWARDED-FOR}i %l %u %t %r %s %b %D %{User-Agent}i" resolveHosts="false"/>
......
3)日誌效果
10.0.11.162 - - [12/Nov/2015:11:22:11 +0800] GET /elesearch-search-api/search/restaurant.json?start=0&end=1&lbs=POINT%28120.285468902%2031.5033700783%29&rt=id&tq=id:328864 HTTP/1.0 200 102 2 python-requests/2.4.3 CPython/2.7.5 Linux/3.10.0-229.11.1.el7.x86_64
10.0.50.54 - - [12/Nov/2015:11:22:11 +0800] GET /elesearch-search-api/search/restaurantv5home.json?rt=id%2Cdelivery_price&lbs=POINT%28120.387601+36.273438%29&end=500&uid=22454922&start=0&from=webapi HTTP/1.0 200 6404 11 python-requests/2.7.0 CPython/2.7.5 Linux/3.10.0-229.el7.x86_64
10.0.40.91 - - [12/Nov/2015:11:22:11 +0800] GET /elesearch-search-api/search/restaurant.json?start=0&end=1&lbs=POINT%28116.316306833%2039.9776800442%29&rt=id&tq=id:376608 HTTP/1.0 200 119 3 python-requests/2.4.3 CPython/2.7.5 Linux/3.10.0-229.11.1.el7.x86_64
現在我們主要來看一下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中的屬性名