filebeat 处理 java 堆栈信息(异常日志)

在接入ELK日志系统时,用的是 filebeat 插件去采集 .log 或 .json 日志,采集 .json 日志时很容易处理,但是采集 .log 日志时就出现了问题,原来测试成功过的配置现在已经无效,鉴于本人有强迫症,最终还是研究出来才能入眠。

.log 日志格式大概是这样的:

2020-08-04 23:39:27.213 ERROR [francis,76fc4531346b63e2,76fc4531346b63e2,false] 16121 --- [nio-8089-exec-8] com.example.demo.aspect.LogAspect        : com.example.demo.controller.StudentController.testError 请求异常,原因:

java.lang.ArithmeticException: / by zero
        at com.example.demo.controller.StudentController.testError(StudentController.java:48)
        at com.example.demo.controller.StudentController$$FastClassBySpringCGLIB$$7356fabf.invoke(<generated>)
        at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
        at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:769)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
        at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:747)

我的目的是在显示的时候,把第一行和下面的异常信息放在一个栏位作为一行日志显示,经过多次调试,终于有了结果,filebeat.yml 配置如下:

filebeat.inputs:
- type: log

  # Change to true to enable this input configuration.
  enabled: true

  # Paths that should be crawled and fetched. Glob based paths.
  paths:
    - /log/francis/*.log
    #- c:\programdata\elasticsearch\logs\*

  # 主要是这个配置,参考官网的配置还不行,经过调试才得出结论
  # multiline.pattern: '^\d{4}-\d{1,2}-\d{1,2}|^[[:space:]]+[(at|\.{3})][[:space:]]+\b|^[[:space:]]+Caused by:'
  multiline.pattern: '^[[:space:]]+[(at|\.{3})][[:space:]]+\b|^[[:space:]]+Caused by:'
  multiline.negate: true
  multiline.match: after

  # 自定义一个字段,在logstash中用来做逻辑处理,这个json可配成其他的,和logstash中保持一致即可
  fields:
     log_type: json
  fields_under_root: true

logstash.conf 配置:

input {
    beats {
        port => "5044"
    }
}

filter {
  if [log_type] == "json" {
    grok {
      match => { "message" => "%{TIMESTAMP_ISO8601:log_date}\s+%{LOGLEVEL:log_level}\s+\[%{DATA:service},%{DATA:traceId},%{DATA:span},%{DATA:exportable}\]\s+%{DATA:pid}\s+---\s+\[%{DATA:thread}\]\s+%{DATA:className}\s+:\s+%{GREEDYDATA:msg}" }
    }

    mutate {
      add_field => { "content" => "%{className} [traceId:%{traceId}][orgId:] %{msg}" }
    }

    date {
       match => ["log_date", "YYYY-MM-dd HH:mm:ss", "YYYY-MM-dd HH:mm:ss.SSS"]
    }

    mutate {
      remove_field => [ "message", "service", "span", "exportable", "pid", "log_type", "msg", "className", "traceId" ]
    }
  }
  # else { 其他处理逻辑 }
}

output {
  stdout{codec=>rubydebug}
}

有异常日志的效果图(其他信息和异常信息合在一起作为content字段输出):
filebeat 处理 java 堆栈信息(异常日志)_第1张图片
无异常日志的效果图:
filebeat 处理 java 堆栈信息(异常日志)_第2张图片

一个比较好的调试网站: https://play.golang.org/p/uAd5XHxscu
此网站需科学上网方能访问,调试效果图:
filebeat 处理 java 堆栈信息(异常日志)_第3张图片

你可能感兴趣的:(ELK)