收集Java堆栈日志

一般应用记录的日志,每行表示一个事务,但有些日志是多行表示一个事务。

例如,常见的Java堆栈日志:

Exception in thread “main” java.lang.NullPointerException

at com.example.myproject.Book.getTitle(Book.java:16)

at com.example.myproject.Author.getBookTitles(Author.java:25)

at com.example.myproject.Bootstrap.main(Bootstrap.java:14)

上面文档表示四行,在Kibana里也视为四个单独的文档,但实际这是一个异常日志,如果分开阅读会脱离上 下文关系,不利于分析。

因此,为了避免此问题,可以让filebeat启用多行处理,将这四行作为一个事件发送。

filebeat多行参数:

• multiline.pattern: ‘^\s’ 正则表达式,匹配行

• multiline.negate: false 否定正则匹配模式,正则取反效果。例如false时将匹配的 行合并到上一行, true时将不匹配的行合并到上一行。默认false

• multiline.match: after 合并到上一行的末尾还是开头(before)

匹配空格开头的行放到不是空格开头的行的下面

修改filebeat配置文件

vi /etc/filebeat/filebeat.yml

filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/test/product.log
tags: ["nginx"]
fields_under_root: true
fields:
project: microservice
app: product


- type: log
enabled: true
paths:
- /var/log/test/gateway.log
tags: ["nginx"]
fields_under_root: true
fields:
project: microservice
app: gateway

- type: log
enabled: true
paths:
- /var/log/nginx/access.log
tags: ["nginx"]
fields_under_root: true
fields:
project: microservice
app: nginx
multiline.pattern: '^\s'
multiline.negate: false
multiline.match: after

output.logstash:
hosts: ["192.168.0.11:5044"]

重启服务

systemctl restart filebeat

模拟java日志数据

[root@localhost ~]# cat a
Exception in thread "main" java.lang.NullPointerException
at com.example.myproject.Book.getTitle(Book.java:16)
at com.example.myproject.Author.getBookTitles(Author.java:25)
at com.example.myproject.Bootstrap.main(Bootstrap.java:14)
[root@localhost ~]# cat a >> /var/log/nginx/access.log

在kibana页面上查看