在接入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字段输出):
无异常日志的效果图:
一个比较好的调试网站: https://play.golang.org/p/uAd5XHxscu
此网站需科学上网方能访问,调试效果图: