博客/工程

在新的2.3洛基:LogQL模式解析器使它容易从非结构化的日志中提取数据

2021年8月9日4分钟

写作LogQL查询来访问洛基的日志数据刚刚容易,多亏了新模式解析器与发布洛基2.3。它使编写为非结构化查询日志格式简单。和模式解析器可以是一个数量级的速度比正则表达式解析器。让我们仔细看看。

Log-parsing困境

洛基2.0引入了新的LogQL处理JSON解析器,logfmt和正则表达式。虽然JSON和logfmt解析器是快速和容易使用,正则表达式解析器既不是。

考虑NGINX的解析日志提取标签和值。找到请求的方法和状态,查询是可怕的和繁琐的。正则表达式是强调在这个示例查询:

我们可以让它简单直观的解析常见的日志格式。毕竟,这些非结构化的日志条目标记字符和空格隔开。

引入模式解析器

如果洛基2.3.0介绍了模式的解析器。它既简单易用和超级有效地提取数据从非结构化的日志。

剧透!这是相同的查询,使用模式编写解析器:

有相当大的区别这个模式表达式和正则表达式。从我自己的经验我知道这对于这个例子生成正则表达式。我花了几个迭代和20分钟。最重要的是,模式解析器解析日志行速度比正则表达式解析器。

模式解析器的语法和语义

调用模式解析器在一个LogQL查询通过指定:

|模式”<模式表达式>”

| <模式表达式>的模式

<模式表达式>指定日志的结构线。它由捕获和文本。

捕获定义一个字段名称和分隔的<>字符。在这个例子中,<状态>定义了字段名的地位。这名未透露姓名的捕获< _ >跳过并忽略匹配日志中的内容。

捕获匹配从一行的开始处,或从先前的文本集的末尾,或者下一组文字。如果一个捕捉不匹配,模式解析器停止处理日志。默认情况下,模式表达式是固定在日志的开始。如果你想改变这种行为,开始你的表达与一位不愿透露姓名的捕捉,< _ >

模式解析器实例

模式解析表达式的例子运行NGINX日志行。这里有三个样本NGINX日志行:

192.0.2.0——[04 / 8月/ 2021:21:12:04 + 0000]“GET / api /插件/ versioncheck ? slugIn = &grafanaVersion = 6.3.5 HTTP / 1.1”200 2”——““Go-http-client / 2.0”“220.248.51.226, 34.120.177.193”“TLSv1.2”“CN”“CN31”
198.51.100.0——[04 / 8月/ 2021:21:12:04 + 0000]”得到/ ws / ?EIO = 3外贸= polling&t = NiJ0b8H HTTP / 1.1 200 103 //www.tubolov.com/grafana/download?平台= mac”“Mozilla / 5.0(麦金塔电脑;Intel Mac OS X 10 _15_7) AppleWebKit / 605.1.15 (KHTML,像壁虎)版本/ 14.1.1 Safari 605.1.15”“2001:240:168:3400:: 1:8, 2600:1901:0: b3ea::“TLSv1.3”“JP JP13”
203.0.113.0——[04 / 8月/ 2021:21:12:04 + 0000]“GET / healthz HTTP / 1.1”200年15”——““GoogleHC / 1.0”“-”“-”“-”“-”

这是例子<模式表达式>:

< _ >——< _ > " <法> < _ > < _ > " <地位> < _ > < _ > " < _ > " < _ >

这个表匹配字段的部分第三样NGINX日志模式表达式。注意,最后一个< _ >字段<模式表达式>日志中消耗结束4个字段,当它停止消费时达到的日志。

NGINX日志行字段 NGINX样本 <模式表达式>
remote_addr美元 203.0.113.0 < _ >
- - - - - - - - - - - - - - - - - -
$ remote_user - - - - - - - - - - - -
(time_local美元) (0000年8月04 / / 2021:21:12:04 +) < _ >
" $请求” “得到/ healthz HTTP / 1.1” “<法> < _ > < _ >”
美元的地位 200年 <状态>
bytes_sent美元 15 < _ >
“http_referer美元” “-” < _ >
“http_user_agent美元” “GoogleHC / 1.0” “< _ >”
“-”“-”“-”“-” < _ >

这个示例日志行定义方法= = 200“获得”和状态。

第二个示例使用模式解析器代理Kubernetes环境使者。这个度量查询返回99延迟/路径和方法,在几秒钟内。

quantile_over_time(0.99,{容器=“特使”}|模式”(< _ >)”<法> <路径> < _ > " < _ > < _ > < _ > < _ > <延迟> ' |打开延迟\ [$ __interval])(方法、路径)/ 1 e3

匹配日志行,本例定义方法,路径和延迟。

了解更多

展示如何阅读和简单的模式表达式,我们创建了一些在我们的GitHub库查询示例。你可以阅读更多关于模式解析器的文档

我们希望您利用这个快速和简单的日志解析。试着自己免费模式解析器Grafana云,最简单的方法开始度量,日志、痕迹和仪表板。注册一个免费账户