1. 簡介
Spring Boot 附帶嵌入式 Tomcat 服務器,非常方便。但是,默認情況下我們無法查看 Tomcat 的日誌。
在本教程中,我們將學習如何通過一個示例應用程序配置 Spring Boot 以顯示 Tomcat 的內部日誌和訪問日誌。
2. 示例應用程序
首先,我們創建一個 REST API。我們將定義一個 GreetingsController 來向用户問候:
@GetMapping("/greetings/{username}")
public String getGreetings(@PathVariable("username") String userName) {
return "Hello " + userName + ", Good day...!!!";
}3. Tomcat 日誌類型
嵌入式 Tomcat 存儲兩種類型的日誌:
- 訪問日誌
- 內部服務器日誌
訪問日誌 記錄了應用程序處理的所有請求的記錄。 這些日誌可用於跟蹤諸如頁面訪問次數和用户會話活動等信息。 與此形成對比,內部服務器日誌 將幫助我們解決正在運行的應用程序中的任何問題。
4. 訪問日誌
默認情況下,訪問日誌未啓用。
可以通過在 application.properties 中添加一個屬性輕鬆啓用它們:
server.tomcat.accesslog.enabled=true同樣,我們也可以使用 VM 參數來啓用訪問日誌:
java -jar -Dserver.tomcat.basedir=tomcat -Dserver.tomcat.accesslog.enabled=true app.jar這些日誌文件將在臨時目錄中創建。例如,在 Windows 系統上,訪問日誌目錄可能類似於 AppData\Local\Temp\tomcat.2142886552084850151.40123\logs
4.1. 格式
因此,啓用此屬性後,我們的應用程序中將看到類似以下內容:
0:0:0:0:0:0:0:1 - - [13/May/2019:23:14:51 +0530] "GET /greetings/Harry HTTP/1.1" 200 27
0:0:0:0:0:0:0:1 - - [13/May/2019:23:17:23 +0530] "GET /greetings/Harry HTTP/1.1" 200 27以下是訪問日誌,格式如下:
%h %l %u %t \"%r\" %>s %b我們可以將其解釋為:
%h – 發送請求的客户端 IP 地址,在本例中為 0:0:0:0:0:0:0:1
%l – 用户的身份
%u – 通過 HTTP 身份驗證確定的用户名
%t – 請求接收時間
%r – 客户端請求行,在本例中為 GET /greetings/Harry HTTP/1.1
%>s – 服務器向客户端發送的狀態碼,例如 200
%b – 響應的大小,或針對這些請求的 27
由於此請求未進行身份驗證,因此 %l 和 %u 打印了短橫線。
事實上,如果缺少任何信息,Tomcat 會為該位置打印短橫線。
4.2. 自定義訪問日誌
我們可以通過在 application.properties 中添加少量屬性來覆蓋默認的 Spring Boot 配置。
首先,要更改默認的日誌文件名:
server.tomcat.accesslog.suffix=.log
server.tomcat.accesslog.prefix=access_log
server.tomcat.accesslog.file-date-format=.yyyy-MM-dd此外,我們還可以更改日誌文件的位置:
server.tomcat.basedir=tomcat
server.tomcat.accesslog.directory=logs最後,我們可以覆蓋日誌寫入方式,使其寫入日誌文件的方式發生改變:
server.tomcat.accesslog.pattern=common此外,Spring Boot 中還有一些可配置的 屬性。
5. 內部日誌
Tomcat 服務器的內部日誌對於解決任何服務器端問題都非常有幫助。
要查看這些日誌,我們需要在 application.properties 中添加以下日誌配置:
logging.level.org.apache.tomcat=DEBUG
logging.level.org.apache.catalina=DEBUG然後我們將會看到類似的內容:
2019-05-17 15:41:07.261 DEBUG 31160 --- [0124-Acceptor-0] o.apache.tomcat.util.threads.LimitLatch : Counting up[http-nio-40124-Acceptor-0] latch=1
2019-05-17 15:41:07.262 DEBUG 31160 --- [0124-Acceptor-0] o.apache.tomcat.util.threads.LimitLatch : Counting up[http-nio-40124-Acceptor-0] latch=2
2019-05-17 15:41:07.278 DEBUG 31160 --- [io-40124-exec-1] org.apache.tomcat.util.modeler.Registry : Managed= Tomcat:type=RequestProcessor,worker="http-nio-40124",name=HttpRequest1
...
2019-05-17 15:41:07.279 DEBUG 31160 --- [io-40124-exec-1] m.m.MbeansDescriptorsIntrospectionSource : Introspected attribute virtualHost public java.lang.String org.apache.coyote.RequestInfo.getVirtualHost() null
...
2019-05-17 15:41:07.280 DEBUG 31160 --- [io-40124-exec-1] o.a.tomcat.util.modeler.BaseModelMBean : preRegister org.apache.coyote.RequestInfo@1e6f89ad Tomcat:type=RequestProcessor,worker="http-nio-40124",name=HttpRequest1
2019-05-17 15:41:07.292 DEBUG 31160 --- [io-40124-exec-1] org.apache.tomcat.util.http.Parameters : Set query string encoding to UTF-8
2019-05-17 15:41:07.294 DEBUG 31160 --- [io-40124-exec-1] o.a.t.util.http.Rfc6265CookieProcessor : Cookies: Parsing b[]: jenkins-timestamper-offset=-19800000
2019-05-17 15:41:07.296 DEBUG 31160 --- [io-40124-exec-1] o.a.c.authenticator.AuthenticatorBase : Security checking request GET /greetings/Harry
2019-05-17 15:41:07.296 DEBUG 31160 --- [io-40124-exec-1] org.apache.catalina.realm.RealmBase : No applicable constraints defined6. 結論
在本文中,我們學習了 Tomcat 內部日誌和訪問日誌之間的區別。此外,我們還了解了如何啓用和自定義這些日誌。