ELK對Tomcat日誌左右開弓-告警觸發/Kibana日誌展現

今天咱們來聊一聊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 &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日誌索引

 

相關文章
相關標籤/搜索