今天咱們來聊一聊Tomcat,相信你們並不陌生,tomcat是一個免費開源的web應用服務器,屬於輕量級的應用程序,在小型生產環境和併發不是很高的場景下被廣泛使用,同時也是開發測試JSP程序的首選。也是處理jsp動態請求不錯的選擇,java
咱們都知道經過日誌定位tomcat的問題,那麼,咱們有真正瞭解過tomcat的日誌嗎?如何作到對tomcat的日誌實時監控,分析展現呢?web
【tomcat日誌剖析】apache
咱們的tomcat主要有兩種日誌類型,即訪問日誌(localhost_access_log.Y-M-D.txt)以及運行狀態日誌(catalina.out)json
localhost_access_log.Y-M-D.log:訪問日誌主要是記錄訪問的時間,IP以及訪問的資料等相關信息bootstrap
catalina.out其實記錄了tomcat運行狀態信息以及異常告警信息等vim
咱們如何對上面的日誌進行監控和分析展現呢?tomcat
首先咱們能夠經過logstash-output-zabbix插件監控catalina.out的日誌輸出信息,過濾出異常關鍵詞,並推送到zabbix平臺上,實時告警ruby
第二,咱們能夠將訪問日誌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日誌索引