WEBKT

Grok 日志解析深度剖析:驯服复杂日志的利器

3 0 0 0

什么是 Grok?

为什么 Grok 这么受欢迎?

Grok 的基本语法

Grok 的常用模式

Grok 实战演练

Grok 的高级用法

Grok 与 Logstash、Elasticsearch、Kibana (ELK Stack)

总结

对于咱们这些程序员、攻城狮来说,日志就像空气一样重要。系统出了问题?查日志!性能瓶颈?查日志!用户行为分析?还是查日志!但是,面对海量、格式各异的日志,你是不是经常感到头大?别担心,今天我就来给你介绍一个日志解析的利器——Grok。

什么是 Grok?

Grok 是一种强大的文本模式匹配工具,它可以将非结构化的日志数据转换成结构化的数据,方便我们进行分析和处理。简单来说,Grok 就像一个翻译器,把机器能看懂的“火星文”日志翻译成我们能看懂的“人话”。

你可以把 Grok 想象成一个正则表达式的“超级加强版”。它预定义了大量的常用模式,比如日期、时间、IP 地址、邮箱等等,我们可以直接使用这些模式,也可以自定义模式,非常灵活。

为什么 Grok 这么受欢迎?

在 Grok 出现之前,处理日志通常需要编写大量的正则表达式,这不仅费时费力,而且容易出错。Grok 的出现,大大简化了日志解析的流程,它有以下几个优点:

  1. 易于使用:Grok 的语法非常简单,即使你没有正则表达式基础,也能快速上手。
  2. 可重用性:Grok 预定义了大量的常用模式,我们可以直接拿来用,也可以将自定义的模式保存起来,方便以后重复使用。
  3. 可扩展性:Grok 支持自定义模式,我们可以根据自己的需求,定义各种各样的模式,满足各种复杂的日志解析需求。
  4. 社区支持:Grok 有一个活跃的社区,你可以在社区中找到大量的学习资料和帮助。

Grok 的基本语法

Grok 的基本语法很简单,它由两部分组成:模式和名称。

%{PATTERN:NAME}
  • PATTERN 是预定义的模式或者自定义的模式。
  • NAME 是你给这个模式匹配到的内容起的名字,方便后续引用。

例如,我们要匹配一个 IP 地址,可以使用预定义的 IP 模式:

%{IP:client_ip}

这个表达式的意思是,匹配一个 IP 地址,并将匹配到的内容命名为 client_ip

如果要匹配一个日期时间,可以使用 TIMESTAMP_ISO8601 模式:

%{TIMESTAMP_ISO8601:timestamp}

这个表达式的意思是,匹配一个 ISO8601 格式的日期时间,并将匹配到的内容命名为 timestamp

Grok 的常用模式

Grok 预定义了大量的常用模式,你可以在 Grok 的官方文档中找到完整的模式列表。这里我列出一些常用的模式:

  • USERNAME:用户名
  • USER:同 USERNAME
  • INT:整数
  • NUMBER:数字(整数或浮点数)
  • BASE10NUM:十进制数字
  • IP:IPv4 或 IPv6 地址
  • IPV4:IPv4 地址
  • IPV6:IPv6 地址
  • HOSTNAME:主机名
  • EMAILADDRESS:邮箱地址
  • URIPROTO:URI 协议 (http, https, ftp 等)
  • URIHOST:URI 主机
  • URIPATH:URI 路径
  • URIPARAM:URI 参数
  • DATA:任意数据
  • GREEDYDATA:贪婪匹配任意数据(尽可能多地匹配)
  • WORD:单词
  • NOTSPACE:非空格字符
  • SPACE:空格字符
  • TIMESTAMP_ISO8601:ISO8601 格式的日期时间 (YYYY-MM-DDTHH:mm:ss.SSSZ)
  • DATESTAMP:日期时间 (YYYY-MM-DD HH:mm:ss)

Grok 实战演练

下面我们通过几个例子,来演示 Grok 的实际应用。

例 1:解析 Apache 访问日志

假设我们有如下一条 Apache 访问日志:

192.168.1.100 - - [24/Apr/2023:14:30:00 +0800] "GET /index.html HTTP/1.1" 200 1234

我们可以使用以下 Grok 表达式来解析这条日志:

%{IP:client_ip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] "%{WORD:method} %{URIPATHPARAM:request} HTTP/%{NUMBER:httpversion}" %{NUMBER:response_code} %{NUMBER:bytes}

解析结果如下:

{
"client_ip": "192.168.1.100",
"ident": "-",
"auth": "-",
"timestamp": "24/Apr/2023:14:30:00 +0800",
"method": "GET",
"request": "/index.html",
"httpversion": "1.1",
"response_code": "200",
"bytes": "1234"
}

例 2:解析自定义日志

假设我们有如下一条自定义日志:

[INFO] 2023-04-24 15:00:00 - User 'john' logged in from 192.168.1.200

我们可以使用以下 Grok 表达式来解析这条日志:

\[%{WORD:level}\] %{TIMESTAMP_ISO8601:timestamp} - User '%{USERNAME:username}' logged in from %{IP:ip_address}

解析结果如下:

{
"level": "INFO",
"timestamp": "2023-04-24 15:00:00",
"username": "john",
"ip_address": "192.168.1.200"
}

例 3:处理多行日志

有些日志是多行的,比如 Java 的异常堆栈信息。对于这种日志,我们需要使用 Grok 的多行模式。

假设我们有如下一条 Java 异常日志:

java.lang.NullPointerException
at com.example.MyClass.myMethod(MyClass.java:123)
at com.example.AnotherClass.anotherMethod(AnotherClass.java:456)

我们可以使用以下 Grok 表达式来解析这条日志(在 Logstash 中配置):

filter {
multiline {
pattern => "^\\s"
what => "previous"
}
grok {
match => { "message" => "%{GREEDYDATA:stacktrace}" }
}
}

这里使用了 multiline 过滤器,将多行日志合并成一行,然后再使用 Grok 进行解析。pattern => "^\\s" 表示以空格开头的行都是上一行的延续。 what => "previous" 表示当前行属于上一行。

Grok 的高级用法

除了基本用法,Grok 还有一些高级用法,可以帮助我们处理更复杂的日志。

  1. 条件匹配:我们可以根据不同的条件,使用不同的 Grok 表达式。
  2. 自定义模式:我们可以定义自己的模式,满足特定的日志解析需求。你可以在 patterns 文件夹下创建一个新的文件,然后在里面定义自己的pattern。
  3. 模式复用:我们可以将常用的模式定义成一个单独的文件,然后在不同的 Grok 表达式中引用。
  4. Debug: 使用 Grok Debugger 来调试你的 pattern。

Grok 与 Logstash、Elasticsearch、Kibana (ELK Stack)

Grok 通常与 Logstash、Elasticsearch、Kibana (ELK Stack) 一起使用,构建一个完整的日志分析平台。

  • Logstash:负责日志的收集、解析和转换。
  • Elasticsearch:负责日志的存储和索引。
  • Kibana:负责日志的可视化和分析。

Logstash 中内置了 Grok 插件,我们可以直接在 Logstash 的配置文件中使用 Grok 来解析日志。解析后的日志数据会被发送到 Elasticsearch 中进行存储和索引,然后我们就可以在 Kibana 中对日志数据进行可视化和分析了。

总结

Grok 是一个强大的日志解析工具,它可以帮助我们轻松地处理各种复杂的日志数据。通过 Grok,我们可以将非结构化的日志数据转换成结构化的数据,方便我们进行分析和处理。如果你经常需要处理日志,那么 Grok 绝对是你的不二之选!希望这篇文章能让你对 Grok 有更深入的了解,并在实际工作中用起来,让日志不再成为你的“拦路虎”!

技术老炮儿 Grok日志解析Logstash

评论点评

打赏赞助
sponsor

感谢您的支持让我们更好的前行

分享

QRcode

https://www.webkt.com/article/8356