ELK(7):ELK-logstash收集tomcat(java)日志


tomcat主要有两种日志类型,即访问日志(localhost_access_log.Y-M-D.txt)以及运行状态日志(catalina.out

localhost_access_log.Y-M-D.log:访问日志主要是记录访问的时间,IP以及访问的资料等相关信息

catalina.out其实记录了tomcat运行状态信息以及异常告警信息等

accesslog

tomcat配置文件修改accesslog

server.xml

首先是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" />

 

改成



<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解析字段的参数



&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校验

 

logstash 实现java 项目日志收集 logstash收集tomcat日志_java

 

logstash文件



input {

    file {

        type => "pe-jira-jenkins-access"

        path => "/home/admin/jenkins/logs/localhost_access.*.log"

        start_position => "beginning"

        stat_interval => "2"

        codec => "json"

    }

}

#如果在input 中添加  codec = json 我设置不起作用,采用这个方式

#filter{

#        json {

#                source => "message"

#                skip_on_invalid_json => true

#                }

#       }

output {

    elasticsearch {

      hosts => ["10.6.76.27:9200"]

      index => "logstash-pe-jira-jenkins-access-%{+YYYY.MM.dd}"

      }

 }



 

测试

logstash 实现java 项目日志收集 logstash收集tomcat日志_大数据_02

 

 

 

catalina.out处理

这个默认会分行处理,但日志很多错误都连起来看才有价值,我们安装一个logstash-filter-multiline

 插件,合并一下日志,多行匹配



 

multiline 使用方法

 

codec =>multiline {

     charset=>...          #可选                    字符编码       

     max_bytes=>...        #可选     bytes类型       设置最大的字节数

     max_lines=>...        #可选     number类型      设置最大的行数,默认是500行

     multiline_tag...      #可选     string类型      设置一个事件标签,默认是multiline

     pattern=>...          #必选     string类型      设置匹配的正则表达式

     patterns_dir=>...     #可选     array类型       可以设置多个正则表达式

     negate=>...           #可选     boolean类型     默认false不显示,可设置ture

     what=>...             #必选                    向前previous , 向后 next

 }

 

 

## negate  只支持布尔值,true 或者false,默认为false。

如果设置为true,表示与正则表达式(pattern)不匹配的内容都需要整合,
具体整合在前还是在后,看what参数。如果设置为false,即与pattern匹配的内容

 

## what  前一行 或者后一行,指出上面对应的规则与前一行内容收集为一行,还是与后一行整合在一起

 

简单来说:

negate默认是 false,不显示

与patten匹配的行

由what决定 向前或向后 匹配

negate 设置为true

则与patten 不匹配的行

由what决定 向前或向后 匹配

 

 logstash配置文件



input {

    file {

        type => "pe-jira-jenkins-access"

        path => "/home/admin/jenkins/logs/localhost_access.*.log"

        start_position => "beginning"

        stat_interval => "2"

        codec => "json"

    }

 

  file {

        type => "jenkins-catalina"

        path => ["/home/admin/jenkins/logs/catalina.out" ]

        codec => plain{

              charset => "UTF-8"

        }

 

   }

}

 

#######

filter {

   if [type] == "jenkins-catalina"{

        multiline {

      pattern => "(^%{TOMCAT_DATESTAMP})|(^%{CATALINA_DATESTAMP})"

      negate => true

      what => "previous"

    }

    if "_grokparsefailure" in [tags] {

      drop { }

    }

    grok {

 

      match => [ "message", "%{TOMCATLOG}", "message", "%{CATALINALOG}" ]

    }

    date {

      match => [ "timestamp", "yyyy-MM-dd HH:mm:ss,SSS Z", "MMM dd, yyyy HH:mm:ss a" ]

    }

  }

 

 }

##########

output {

   if [type] == "pe-jira-jenkins-access" {

    elasticsearch {

      hosts => ["10.6.76.27:9200"]

      index => "logstash-pe-jira-jenkins-access-%{+YYYY.MM.dd}"

      }

 }

  if [type]  == "jenkins-catalina" {

      elasticsearch {

        hosts => ["10.6.76.27:9200"]

        index => "logstash-pe-jira-jenkins-catalina-%{+YYYY.MM.dd}"

      }

 }

}



 

测试

 

logstash 实现java 项目日志收集 logstash收集tomcat日志_elasticsearch_03

 

 

logstash 实现java 项目日志收集 logstash收集tomcat日志_json_04