Spring boot列印tomcat日誌
在tomcat配置檔案server.xml中有一個地方配置列印tomcat的訪問日誌,但是在spring boot中將tomcat自動嵌入到專案中,這是怎麼來配置tomcat的訪問日誌呢?本篇文章將詳細介紹怎麼在spring boot中配置tomcat的訪問日誌(在application.properties)
在tomcat的access中列印請求的情況可以幫助我們分析問題,通常比較關注的有訪問ip、執行緒號、訪問url、返回狀態碼、訪問時間、持續時間和請求header等資訊。
可以在spring boot的配置檔案中新增server.tomcat.accesslog配置tomcat的access日誌
server.tomcat.accesslog.buffered=true # Buffer output such that it is only flushed periodically.
server.tomcat.accesslog.directory=logs # Directory in which log files are created. Can be relative to the tomcat base dir or absolute.
server.tomcat.accesslog.enabled=false # Enable access log.
server.tomcat.accesslog.file-date-format=.yyyy-MM-dd
server.tomcat.accesslog.pattern=common # Format pattern for access logs.
server.tomcat.accesslog.prefix=access_log # Log file name prefix.
server.tomcat.accesslog.rename-on-rotate=false # Defer inclusion of the date stamp in the file name until rotate time.
server.tomcat.accesslog.request-attributes-enabled=false
server.tomcat.accesslog.rotate=true # Enable access log rotation.
server.tomcat.accesslog.suffix=.log # Log file name suffix.
比較常見的配置有:
1、server.tomcat.accesslog.enabled,取值true和false,需要accesslog時設定為true
2、server.tomcat.accesslog.directory,指定access檔案的路徑
3、server.tomcat.accesslog.pattern,定義日誌的格式
4、server.tomcat.accesslog.rotate,指定是否啟用日誌輪轉,預設為true。這個引數決定是否需要切換日誌檔案,如果設定成false,則日誌檔案不會切換,即所有的檔案列印到同一個日誌檔案中,並且file-date-format引數會被忽略
pattern的配置
- %a - Remote IP address,遠端ip地址,注意不一定是原始ip地址,中間可能經過nginx等的轉發
- %A - Local IP address,本地ip
- %b - Bytes sent, excluding HTTP headers, or '-' if no bytes were sent
- %B - Bytes sent, excluding HTTP headers
- %h - Remote host name (or IP address if
enableLookups
for the connector is false),遠端主機名稱(如果resolveHosts為false則展示IP) - %H - Request protocol,請求協議
- %l - Remote logical username from identd (always returns '-')
- %m - Request method,請求方法(GET,POST)
- %p - Local port,接受請求的本地埠
- %q - Query string (prepended with a '?' if it exists, otherwise an empty string
- %r - First line of the request,HTTP請求的第一行(包括請求方法,請求的URI)
- %s - HTTP status code of the response,HTTP的響應程式碼,如:200,404
- %S - User session ID
- %t - Date and time, in Common Log Format format,日期和時間,Common Log Format格式
- %u - Remote user that was authenticated
- %U - Requested URL path
- %v - Local server name
- %D - Time taken to process the request, in millis,處理請求的時間,單位毫秒
- %T - Time taken to process the request, in seconds,處理請求的時間,單位秒
- %I - current Request thread name (can compare later with stacktraces),當前請求的執行緒名,可以和列印的log對比查詢問題
Access log 也支援將cookie、header、session或者其他在ServletRequest中的物件資訊列印到日誌中,其配置遵循Apache配置的格式({xxx}指值的名稱):
%{xxx}i
for incoming headers,request header資訊%{xxx}o
for outgoing response headers,response header資訊%{xxx}c
for a specific cookie%{xxx}r
xxx is an attribute in the ServletRequest%{xxx}s
xxx is an attribute in the HttpSession%{xxx}t
xxx is an enhanced SimpleDateFormat pattern (see Configuration Reference document for details on supported time patterns)
Access log內建了兩個日誌格式模板,可以直接指定pattern為模板名稱,如:
server.tomcat.accesslog.pattern=common
- common -
%h %l %u %t "%r" %s %b
,依次為:遠端主機名稱,遠端使用者名稱,被認證的遠端使用者,日期和時間,請求的第一行,response code,傳送的位元組數 - combined -
%h %l %u %t "%r" %s %b "%{Referer}i" "%{User-Agent}i"
,依次為:遠端主機名稱,遠端使用者名稱,被認證的遠端使用者,日期和時間,請求的第一行,response code,傳送的位元組數,request header的Referer資訊,request header的User-Agent資訊。
除了內建的模板,我們常用的配置有:
%t %a "%r" %s (%D ms)
,日期和時間,請求來自的IP(不一定是原始IP),請求第一行,response code,響應時間(毫秒),樣例:[21/Mar/2017:00:06:40 +0800] 127.0.0.1 POST /bgc/syncJudgeResult HTTP/1.0 200 63
,這裡請求來自IP就是經過本機的nginx轉發的。%t [%I] %{X-Forwarded-For}i %a %r %s (%D ms)
,日期和時間,執行緒名,原始IP,請求來自的IP(不一定是原始IP),請求第一行,response code,響應時間(毫秒),樣例:[21/Apr/2017:00:24:40 +0800][http-nio-7001-exec-4] 10.125.15.1 127.0.0.1 POST /bgc/syncJudgeResult HTTP/1.0 200 5
,這裡的第一個IP是Nginx配置了X-Forwarded-For
記錄了原始IP。
這裡簡要介紹下上面用到的HTTP請求頭X-Forwarded-For
,它是一個 HTTP 擴充套件頭部,用來表示 HTTP 請求端真實 IP,其格式為:X-Forwarded-For: client, proxy1, proxy2
,其中的值通過一個逗號+空格
把多個IP地址區分開,最左邊(client)是最原始客戶端的IP地址,代理伺服器每成功收到一個請求,就把請求來源IP地址新增到右邊。