一、使用
1、查看 grok 自带的正则
2、语法
需要提取出字段名
%{官方定义的正则名或者自定义的正则名:从日志中提取出来的字段名}
不需要提取出字段名
%{官方定义的正则名或者自定义的正则名}
3、使用
1)、Sample Data
Sample Data
(原数据)
[2020-09-26 13:07:54] GET http://www.test.com/index/index/test 0.118220
2)、Grok Pattern
Grok Pattern
(grok 正则)
\[%{TIMESTAMP_ISO8601:timestamp}\] %{USERNAME:method}[T ]%{URL:url} %{NUMBER:exec_time}
3)、Custom Patterns
Custom Patterns
(自定义正则)
- 由于grok自带的网址匹配每页匹配
http://
,https://
。所以我们自定义一个名为URL
的正则,如下所示
URL (http(s)?:\/\/)?%{URIHOST:domain_name}%{URIPATH}
4)、结果
Kibana -> Console -> Grok Debugger 中执行的结果
{
"domain_name": "www.test.com",
"method": "GET",
"exec_time": "0.118220",
"url": "http://www.test.com/index/index/test",
"timestamp": "2020-09-26 13:07:54"
}
5)、正则讲解
\[
:匹配字符 [%{TIMESTAMP_ISO8601:timestamp}
:把符合TIMESTAMP_ISO8601正则的内容匹配出来,作为timestamp字段存入es:匹配空格
%{USERNAME:method}
:把符合USERNAME(USERNAME其实就是个字符串匹配)正则的内容匹配出来,作为method字段存入es[T ]
:匹配空格%{URL:url}
:把符合自定义的 URL正则的内容匹配出来,作为url字段存入es- 自定义的
URL
中有自己写的正则,也用到了grok的正则
; %{URIHOST:domain_name}
提取了字段名domain_name
到es;%{URIPATH}
没有提取出字段名
- 自定义的
:匹配空格
%{NUMBER:exec_time}
:把符合NUMBER正则的内容匹配出来,作为exec_time字段存入es
二、在线测试
1、在线Grok Debug工具,Grok校验|调试
- 在线Grok Debug工具,Grok校验|调试
效果图如下所示:
2、Kibana中调试
- Kibana -> Console -> Grok Debugger 中执行的结果
效果图如下所示:
三、logstash配置文件
1、配置文件输入
input {
file {
...
}
}
filter {
grok {
match => {
"message"=>"\[%{TIMESTAMP_ISO8601:timestamp}\] %{USERNAME:method}[T ]%{URL:url} %{NUMBER:exec_time}"
}
}
}
output {
...
}
2、自定义正则生效
如何使我们自定义的正则生效呢,找到 logstash 中的文件
grok-patterns
,在文件末尾追加自定义的内容(名字不能与已有的名字重复),重启服务生效。
正则配置文件路径:logstash/vendor/bundle/jruby/2.5.0/gems/logstash-patterns-core-4.1.2/patterns/grok-patterns
...
# Log formats
SYSLOGBASE %{SYSLOGTIMESTAMP:timestamp} (?:%{SYSLOGFACILITY} )?%{SYSLOGHOST:logsource} %{SYSLOGPROG}:
# Log Levels
LOGLEVEL ([Aa]lert|ALERT|[Tt]race|TRACE|[Dd]ebug|DEBUG|[Nn]otice|NOTICE|[Ii]nfo|INFO|[Ww]arn?(?:ing)?|WARN?(?:ING)?|[Ee]rr?(?:or)?|ERR?(?:OR)?|[Cc]rit?(?:ical)?|CRIT?(?:ICAL)?|[Ff]atal|FATAL|[Ss]evere|SEVERE|EMERG(?:ENCY)?|[Ee]merg(?:ency)?)
# 用户自定义正则
URL (http(s)?:\/\/)?%{URIHOST:domain_name}%{URIPATH}