ELK對Tomcat日志雙管齊下-告警觸發/Kibana日志展示


今天我們來聊一聊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 &quot;%r&quot; %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="{&quot;client&quot;:&quot;%h&quot;, &quot;client user&quot;:&quot;%l&quot;, &quot;authenticated&quot;:&quot;%u&quot;, &quot;access time&quot;:&quot;%t&quot;, &quot;method&quot;:&quot;%r&quot;, &quot;status&quot;:&quot;%s&quot;, &quot;send bytes&quot;:&quot;%b&quot;, &quot;Query?string&quot;:&quot;%q&quot;, &quot;partner&quot;:&quot;%{Referer}i&quot;, &quot;Agent version&quot;:&quot;%{User-Agent}i&quot;}"/>

參數詳情: 

directory:日志文件存放的位置

prefix:日志文件名稱前綴

suffix:日志名稱后綴

pattern:是一個json解析字段的參數

&quot;client&quot;:&quot;%h&quot;其中%h表示請求的主機名稱,這里指的是請求端的IP
&quot;client user&quot;:&quot;%l&quot;其中%l記錄的是劉拉着進行身份驗證時提供的名稱
&quot;authenticated&quot;:&quot;%u&quot; 其中%u代表獲得驗證的訪問請求者,否則就是"-"
&quot;access time&quot;:&quot;%t&quot; 其中%t代表請求的時間
&quot;method&quot;:&quot;%r&quot; 其中%r代表請求的方法和URL
&quot;status&quot;:&quot;%s&quot; 其中%s代表HTTP的響應狀態碼
&quot;send bytes&quot;:&quot;%b&quot; 其中%b代表發送請求的字節數,但不包括請求http頭部信息
 &quot;Query?string&quot;:&quot;%q&quot; 其中%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日志索引

 


免責聲明!

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



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