• 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>[sS]*)]s+[%{DATA:exception_info}](?<tomcatcontent>[sS]*)" }
            }
            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日志索引

     

  • 相关阅读:
    在wepy里面使用redux
    使用es6的蹦床函数解决递归造成的堆栈溢出
    解决layui下拉选择框只能选择不能手动输入文字
    POJ 2230 Watchcow (欧拉回路)
    POJ 2337 Catenyms (欧拉回路)
    POJ 2513 Colored Sticks (欧拉回路 + 字典树 +并查集)
    HDU 3018 Ant Trip (欧拉回路)
    HDU 1023 Train Problem II (大数卡特兰数)
    HDU 2067 小兔的棋盘 (卡特兰数)
    HDU 3584 Cube (三维数状数组)
  • 原文地址:https://www.cnblogs.com/bixiaoyu/p/9665677.html
Copyright © 2020-2023  润新知