今天我們來聊一聊Tomcat,相信大家並不陌生,tomcat是一個免費開源的web應用服務器,屬於輕量級的應用程序,在小型生產環境和並發不是很高的場景下被普遍使用,同時也是開發測試JSP程序的首選。也是處理jsp動態請求不錯的選擇,
我們都知道通過日志定位tomcat的問題,那么,我們有真正了解過tomcat的日志嗎?如何做到對tomcat的日志實時監控,分析展示呢?
【tomcat日志剖析】
我們的tomcat主要有兩種日志類型,即訪問日志(localhost_access_log.Y-M-D.txt)以及運行狀態日志(catalina.out)
localhost_access_log.Y-M-D.log:訪問日志主要是記錄訪問的時間,IP以及訪問的資料等相關信息
catalina.out其實記錄了tomcat運行狀態信息以及異常告警信息等
我們如何對上面的日志進行監控和分析展示呢?
首先我們可以通過logstash-output-zabbix插件監控catalina.out的日志輸出信息,過濾出異常關鍵詞,並推送到zabbix平台上,實時告警
第二,我們可以將訪問日志localhost_access_log.Y-M-D.log進行收集推送到Kibana平台上進行展示,兩者互不影響
【Tomcat日志整改】
我們要想更好的將tomcat兩種日志准確的定位抓取,需要自定義tomcat日志格式
首先是locathost_accesslog.Y-M-D.log訪問日志,將日志輸出定義為json格式,方便后續kibana展示
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log." suffix=".txt" pattern="%h %l %u %t "%r" %s %b" />
Note: The pattern used is equivalent to using pattern="common" --> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access" suffix=".log"
pattern="{"client":"%h", "client user":"%l", "authenticated":"%u", "access time":"%t", "method":"%r", "status":"%s", "send bytes":"%b", "Query?string":"%q", "partner":"%{Referer}i", "Agent version":"%{User-Agent}i"}"/>
參數詳情:
directory:日志文件存放的位置
prefix:日志文件名稱前綴
suffix:日志名稱后綴
pattern:是一個json解析字段的參數
"client":"%h"其中%h表示請求的主機名稱,這里指的是請求端的IP
"client user":"%l"其中%l記錄的是劉拉着進行身份驗證時提供的名稱
"authenticated":"%u" 其中%u代表獲得驗證的訪問請求者,否則就是"-"
"access time":"%t" 其中%t代表請求的時間
"method":"%r" 其中%r代表請求的方法和URL
"status":"%s" 其中%s代表HTTP的響應狀態碼
"send bytes":"%b" 其中%b代表發送請求的字節數,但不包括請求http頭部信息
"Query?string":"%q" 其中%q指的是查詢字符串的意思
#tail -f tomcat_access2018-09-18.log
{"client":"192.168.2.10", "client user":"-", "authenticated":"-", "access time":"[18/Sep/2018:17:17:12 +0800]", "method":"GET /favicon.ico HTTP/1.1", "status":"200", "send bytes":"21630", "Query?string":"", "partner":"http://192.168.2.101:8080/", "Agent version":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"}
輸出日志並JSON校驗

【catlina.out日志輸出整改】
我們tomcat的運行狀態日志的輸出看上去很不順眼,很不友好,為了能夠更好的分析,我們需要進行整改
# vim /usr/local/tomcat/conf/logging.properties
#java.util.logging.ConsoleHandler.formatter = org.apache.juli.OneLineFormatter #將其刪除或者注釋掉
添加下面兩行配置, lina.org.apache.juli.AsyncFileHandler.formatter = java.util.logging.SimpleFormatter java.util.logging.SimpleFormatter.format = %1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS.%1$tL [%4$s] [%3$s] %2$s %5$s %6$s%n


【filebeat配置】
filebeat.inputs: #定義數據原型 - type: log #指定數據輸入的類型,還可以指定為stdin,即為標准輸入 enabled: true #啟動手工配置filebeat, paths: #指定需要監控的日志文件 - /usr/local/tomcat/logs/tomcat_access2018-09-18.log #這是tomcat的訪問日志文件 fields: log_topic: tomcat_access_logs #自定義tomcat訪問日志的topic主題,推送到kafka消息隊列 - type: log enabled: true paths: - /usr/local/tomcat/logs/catalina.out #這是定義的第二個tomcat日志文件catalina.out,運行狀態日志 fields: log_topic: tomcat_catalina_logs #自定義tomcat的運行狀態日志topic主題名稱,用於推送到kafka消息隊列 processors: #設置刪除不必要的字段 - drop_fields: fields: ["beat", "input", "source", "offset", "prospector"] filebeat.config.modules: path: ${path.config}/modules.d/*.yml reload.enabled: false name: 192.168.2.101 #設置filebeat收集日志文件對應主機的名稱 output.kafka: #指定輸入端,支持想kafka,logstash,elasticsearch輸出數據 enabled: true #啟動該模塊 hosts: ["192.168.2.100:9092", "192.168.2.101:9092", "192.168.2.102:9092"] version: "0.10" topic: '%{[fields.log_topic]}' #這是指定topic,注意寫法,上面新增了兩個字段,兩個對應的日志文件會分別寫入不同的topic partition.round_robin: reachable_only: true worker: 2 required_acks: 1 compression: gzip max_message_bytes: 10000000 logging.level: debug

下面是kafka消息隊列中tomcat消息,都為json格式輸出,可通過json校驗工具校驗一下格式:http://www.bejson.com/


【Logstash配置】
[root@logstash etc]# /usr/local/logstash/bin/logstash-plugin install logstash-output-zabbix #既然需要結合zabbix監控tomcat的catilna.out的異常日志,需要安裝logstash-output-zabbix插件
Validating logstash-output-zabbix
Installing logstash-output-zabbix
Installation successful
input { #這里定義了兩個消費topic,分別讀取的是tomcat的訪問日志和catalina.out文件 kafka { bootstrap_servers => "192.168.2.100:9092,192.168.2.101:9092,192.168.2.102:9092" topics => ["tomcat_access_logs"] codec => "json" } kafka { bootstrap_servers => "192.168.2.100:9092,192.168.2.101:9092,192.168.2.102:9092" topics => ["tomcat_catalina_logs"] codec => "json" } } filter { if [fields][log_topic] == "tomcat_catalina_logs" { #判斷語句,根據topic不同,對日志做不同的過濾、分析,先分析的是catalina.out文件 mutate { add_field => [ "[zabbix_key]", "tomcat_catalina_logs" ] #這里是直接用topic主題 add_field => [ "[zabbix_host]", "%{[host][name]}" ] } grok { match => { "message" => "%{TIMESTAMP_ISO8601:access_time}\s+\[(?<loglevel>[\s\S]*)\]\s+\[%{DATA:exception_info}\](?<tomcatcontent>[\s\S]*)" } } date { match => [ "access_time","MMM d HH:mm:ss", "MMM dd HH:mm:ss", "ISO8601"] } mutate { remove_field => "@version" remove_field => "message" #remove_field => "[fields][log_topic]" #remove_field => "fields" remove_field => "access_time" } } if [fields][log_topic] == "tomcat_access_logs" { #判斷語句,根據topic不同,對日志做不同的過濾、分析,這里分析的是訪問日志文件 json { source => "message" #由於訪問日志文件已經是json格式,所以這里解碼出來即可 } date { match => [ "access time" , "[dd/MMM/yyyy:HH:mm:ss Z]" ] #時間字段轉換,然后賦值給@timestamp字段 } mutate { remove_field => "@version" #刪除不需要的字段 remove_field => "message" #刪除message字段 } } } output { if [fields][log_topic] == "tomcat_catalina_logs" { #輸出判斷,根據不同的topic,做不同的輸出設置 if ([loglevel] =~ "INFO" or [tomcatcontent] =~ /(Exception|error|ERROR|Failed)/ ) { #對catalina.out文件出現前面指定的關鍵字,過濾關鍵字,推送到zabbix端實現出發告警 zabbix { zabbix_host => "[zabbix_host]" zabbix_key => "[zabbix_key]" zabbix_server_host => "192.168.2.102" #這里指定的zabbix-serverIP地址 zabbix_server_port => "10051" zabbix_value => "tomcatcontent" #這是輸出到zabbix的內容配置 } } } if [fields][log_topic] == "tomcat_access_logs" { #輸出判斷,根據不同的topic,做不同的輸出設置,這是將訪問日志輸出到elasticsearch集群 elasticsearch { hosts => ["192.168.2.100:9200","192.168.2.101:9200","192.168.2.102:9200"] index => "tomcatlogs-%{+YYYY.MM.dd}" } } # stdout { codec => rubydebug } #調試模式,可以方便觀看日志輸出是否正常,調試完成后,刪除即可 }
# nohup /usr/local/logstash/bin/logstash -f tomcat_logs.conf & #后台執行運行logstash事件
ps:下圖是前台執行的測試,需要在output加上stdout { codec=rubydebug}參數,可以用作調試

【zabbix創建監控模板】





【驗證zabbix監控端】
驗證一下,故意在tomcat配置文件輸出錯誤配置,然后運行tomcat,此時,catilna.out日志便會有輸出,而輸出中已經在logstash事件配置中做了相應的過濾和指定,會將錯誤信息直接推送到zabbix,實現出發告警
效果如下:



【驗證tomcat的訪問日志】
我們知道,當tomcat有一定的訪問量之后,會先存入ES中,由kibana拉取展示分析,過程如下:

http://192.168.2.101:5601 訪問kibana,創建tomcat日志索引





