一、背景
咱们的应用程序通常每天都会产生十分多的日志,这些日志大多都是一个字符串的格局,那么咱们如果想从中提取一些有用的信息(比方
:申请的工夫、日志的级别等),那么应该如果实现呢?
二、解决思路
针对以上的问题,咱们能够通过 正则表达式
来匹配咱们的日志内容,从而达到提取到有用的数据。而 logstash
的 grok
正好能够帮忙咱们做到这种事。
如果咱们的日志是有肯定的格局的,也能够应用 dissert 插件来解决,这个是依据某个分隔符来获取日志内容的。
三、前置常识
-
grok
插件为咱们提供了大略120
种可用的模式。能够简略了解,grok
提供好了 120 种定义好的可用这则。- 比方:
INT
对应的正则(?:[+-]?(?:[0-9]+))
示意 正负数字。 grok
提供好的可用模式。https://github.com/logstash-plugins/logstash-patterns-core/tree/master/patterns
- 比方:
-
grok 语法的格局
-
%{SYNTAX:SEMANTIC}
SYNTAX
示意须要匹配文本的格局。比方:文本内容:123
能够被INT
匹配到。SEMANTIC
示意 SYNTAX 匹配到文本后,将内容保留到那个字段中。比方:%{INT:age} 则匹配到后的 age 字段有值。
-
-
自定义
grok
模式(custom patterns)- 语法格局:
(?<field_name>the pattern here)
- 比方: (?<userName>[a-zA-Z]{3,5}) 用户名只能是 3 到 5 位的字母
- 语法格局:
-
grok 调试网站
- 能够在此网站调试咱们的 grok 表达式是否编写正确 http://grokdebug.herokuapp.com/
-
grok 解析失败和超时会减少如下标签
解析失败
,会在生成数据中的tags
中介减少_grokparsefailure
标签解析超时
,会在生成数据中的tags
中减少_groktimeout
标签
四、实现步骤
1、筹备测试数据
[9708] 2021-05-13 11:14:51.873 [http-nio-8080-exec-1] INFO org.springframework.web.servlet.DispatcherServlet#initServletBean:547 -Completed initialization in 1 ms
[9708] 2021-05-13 11:14:51.910 [http-nio-8080-exec-1] ERROR com.huan.study.LogController#showLog:32 - 申请:[/showLog]产生了异样
java.lang.ArithmeticException: / by zero
at com.huan.study.LogController.showLog(LogController.java:30)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
2、编写 grok
表达式
(?m)^\[%{INT:pid}\]%{SPACE}%{TIMESTAMP_ISO8601:createTime}%{SPACE}\[%{DATA:threadName}\]%{SPACE}%{LOGLEVEL:LEVEL}%{SPACE}%{JAVACLASS:javaClass}#(?<methodName>[a-zA-Z_]+):%{INT:linenumber}%{SPACE}-%{GREEDYDATA:msg}
留神⚠️:
1、如果要匹配多行文本,比方 java 中的异样堆栈, 则在表达式前须要加上(?m)
。
2、应用 \
能够进行本义。
3、其中的(?<methodName>[a-zA-Z_]+)
methodName 为咱们自定义的正则。
3、编写 logstash pipeline 文件
input {
file {
id => "mutate-id"
path => ["/Users/huan/soft/elastic-stack/logstash/logstash/pipeline.conf/filter-grok/*.log"]
start_position => "beginning"
sincedb_path => "/Users/huan/soft/elastic-stack/logstash/logstash/pipeline.conf/filter-grok/sincedb.db"
codec => multiline {
pattern => "^\[+"
negate => "true"
what => "previous"
charset => "UTF-8"
auto_flush_interval => 2
}
}
}
filter {
grok {
match => {"message" => "(?m)^\[%{INT:pid}\]%{SPACE}%{TIMESTAMP_ISO8601:createTime}%{SPACE}\[%{DATA:threadName}\]%{SPACE}%{LOGLEVEL:LEVEL}%{SPACE}%{JAVACLASS:javaClass}#(?<methodName>[a-zA-Z_]+):%{INT:linenumber}%{SPACE}-%{GREEDYDATA:msg}"
}
}
}
output {
stdout {codec => rubydebug {}
}
}
4、查看运行后果
五、代码地址
1、SpringBoot 程序测试地址
六、参考网址
1、https://github.com/logstash-plugins/logstash-patterns-core/tree/master/patterns
2、http://grokdebug.herokuapp.com/
3、https://www.elastic.co/guide/en/logstash/current/plugins-filters-grok.html