springboot內嵌tomcat日志配置及優化


在tomcat的access中打印出請求的情況可以幫助我們分析問題,通常比較關注的有訪問IP、線程號、訪問url、返回狀態碼、訪問時間、持續時間。

tomcat主要涉及到兩類日志配置:

  • access log
  • tomcat log

access log捕捉http請求
tomcat log打印啟動全過程

參考的國外的博客,直接貼下測試代碼:

@RestController
public class HelloController {
    @GetMapping("/greetings/{username}")
    public String getGreetings(@PathVariable("username") String userName) {
        return "Hello " + userName + ", Good day...!!!";
    }
}

2.配置access log

server:
  port: 9000
  servlet:
    context-path: / # 配置access日志
  tomcat:
    accesslog:
      enabled: true
      file-date-format: .yyyy-MM-dd
      suffix: .log
      prefix: access_log
      directory: tomcat_log
      pattern: common
    basedir: d:/tmp

配置好后啟動項目,瀏覽器訪問:

http://localhost:9000/greetings/tom

查看磁盤上的日志文件d:/tmp/tomcat_log/access_log.2020-06-13.log

accesslog參數解釋:

省略了前綴server.tomcat.accesslog

  • enabled,取值true、false,需要accesslog時設置為true

  • directory,指定access文件的路徑

  • rotate,指定是否啟用日志輪轉。默認為true。這個參數決定是否需要切換切換日志文件,如果被設置為false,則日志文件不會切換,即所有文件打到同一個日志文件中,並且file-date-format參數也會被忽略

  • pattern,定義日志的格式,

    pattern的配置:

    %a - 遠程IP地址

    %A - 本地IP地址

    %b - 發送的字節數(Bytes sent), 不包括HTTP headers的字節,如果為0則展示'-'

    %B - 發送的字節數(Bytes sent), 不包括HTTP headers的字節

    %h - 遠程主機名稱(如果resolveHosts為false則展示IP)

    %H - 請求協議

    %l - 遠程用戶名,始終為'-'(Remote logical username from identd)

    %m - 請求的方法(GET, POST等)%p - 接受請求的本地端口

    %q - 查詢字符串,如果存在,有一個前置的'?'

    %r - 請求的第一行(包括請求方法和請求的URI)

    %s - response的HTTP狀態碼(200,404等)%S - 用戶的session ID

    %t - 日期和時間,Common Log Format格式

    %u - 被認證的遠程用戶, 不存在則展示'-'

    %U - 請求URL路徑%v - 本地服務名

    %D - 處理請求的時間,單位為毫秒

    %T - 處理請求的時間,單位為秒%I - 當前請求的線程名(can compare later with stacktraces)

pattern可以設置為指定的模板名稱,具體含有如下:

  • 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信息。

Access Log中也支持cookie,請求header,響應headers,Session或者其他在ServletRequest中的對象的信息。格式遵循apache語法:

%{xxx}i 請求headers的信息

%{xxx}o 響應headers的信息

%{xxx}c 請求cookie的信息

%{xxx}r xxx是ServletRequest的一個屬性

%{xxx}s xxx是HttpSession的一個屬性

說明:combined模式的pattern可以增加Referer和User-Agent headers的參數形式,每個參數用雙引號包起來,引號中的內容還是上面列舉的參數。比如"%{User-Agent}i"使其為”%{User-Agent}i“,即請求的User-Agent(客戶端,瀏覽器)。

3.配置tomcat log

# 配置tomcat日志
logging:
  level:
    org.apache.tomcat: DEBUG
    org.apache.catalina: DEBUG

啟動項目觀察日志,發現打印了一堆DEBUG信息:

 

 

 4.實時查看tomcat線程數

linux系統

獲取tomcat進程pid
ps -ef|grep tomcat

統計該tomcat進程內的線程個數
ps -Lf 29295 |wc -l

windows系統

其中8080為tomcat默認端口,如果端口有修改,可使用修改后的端口

pstree -p 后面為進程id。

netstat -ano|findstr 8080
pstree -p 5240 | wc -l

5.Springboot內置Tomcat配置調優

 針對目前的容器優化,可以從以下幾點考慮:

1、線程數  2、超時時間  3、JVM優化

首先,線程數是一個重點,每一次HTTP請求到達Web服務器,Web服務器都會創建一個線程來處理該請求,該參數決定了應用服務同時可以處理多少個HTTP請求。

比較重要的有兩個:初始線程數最大線程數

初始線程數:保障啟動的時候,如果有大量用戶訪問,能夠很穩定的接受請求。最大線程數:用來保證系統的穩定性。

超時時間:用來保障連接數不容易被壓垮。如果大批量的請求過來,延遲比較高,很容易把線程數用光,這時就需要提高超時時間。這種情況在生產中是比較常見的 ,一旦網絡不穩定,寧願丟包也不能把服務器壓垮

min-spare-threads:最小備用線程數,tomcat啟動時的初始化的線程數。

max-threads:Tomcat可創建的最大的線程數,每一個線程處理一個請求,超過這個請求數后,客戶端請求只能排隊,等有線程釋放才能處理。(建議這個配置數可以在服務器CUP核心數的200~250倍之間)

accept-count:當調用Web服務的HTTP請求數達到tomcat的最大線程數時,還有新的HTTP請求到來,這時tomcat會將該請求放在等待隊列中,這個acceptCount就是指能夠接受的最大等待數,默認100。如果等待隊列也被放滿了,這個時候再來新的請求就會被tomcat拒絕(connection refused)。

max-connections:這個參數是指在同一時間,tomcat能夠接受的最大連接數。一般這個值要大於(max-threads)+(accept-count)。

connection-timeout:最長等待時間,如果沒有數據進來,等待一段時間后斷開連接,釋放線程

在spring boot配置文件中application.yml,添加以下配置:

這塊對tomcat進行了一個優化配置,最大線程數是2500,初始化線程是500,超時時間是12000ms;

# Tomcat
server:
  tomcat:
    uri-encoding: UTF-8
    #最小線程數
    min-spare-threads: 500
    #最大線程數
    max-threads: 2500
    #最大鏈接數
    max-connections: 6500
    #最大等待隊列長度
    accept-count: 1000
    #請求頭最大長度kb
    max-http-header-size: 1048576
    #請請求體最大長度kb
    #max-http-post-size: 2097152
  #服務http端口
  port: 8080
  #鏈接建立超時時間
  connection-timeout: 12000

JVM優化一般來說沒有太多場景,無非就是加大初始的堆,和最大限制堆,當然也不能無限增大,要根據實際情況優化。

初始內存和最大內存基本會設置成一樣的,具體大小根據場景設置,-server是一個必須要用的參數,至於收集器這些使用默認的就可以了,除非有特定需求

1.使用-server模式:設置JVM使用server模式。64位JDK默認啟動該模式。

2.指定堆參數:這個根據服務器的內存大小,來設置堆參數。

-Xms :設置Java堆棧的初始化大小

-Xmx :設置最大的java堆大小

設置初始化堆內存為10240MB,最大為14336MB。

nohup $JAVA_HOME/bin/java -server -Xms10240m -Xmx14336m -Xmn9216m -XX:MetaspaceSize=400m -XX:MaxMetaspaceSize=5120m -XX:-OmitStackTraceInFastThrow -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -Xloggc:./custom_gc.log -XX:ErrorFile=./custom_error.log -jar $APP_HOME/$APP_MAINCLASS >> $LOG_FILE 2>&1 &

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM