`

[转]Grok 正则捕获

    博客分类:
  • ELK
阅读更多

Grok 是 Logstash 最重要的插件。你可以在 grok 里预定义好命名正则表达式,在稍后(grok参数或者其他正则表达式里)引用它。

正则表达式语法

运维工程师多多少少都会一点正则。你可以在 grok 里写标准的正则,像下面这样:

\s+(?<request_time>\d+(?:\.\d+)?)\s+

小贴士:这个正则表达式写法对于 Perl 或者 Ruby 程序员应该很熟悉了,Python 程序员可能更习惯写 (?P<name>pattern),没办法,适应一下吧。

现在给我们的配置文件添加第一个过滤器区段配置。配置要添加在输入和输出区段之间(logstash 执行区段的时候并不依赖于次序,不过为了自己看得方便,还是按次序书写吧):

input {stdin{}}
filter {
    grok {
        match => {
            "message" => "\s+(?<request_time>\d+(?:\.\d+)?)\s+"
        }
    }
}
output {stdout{}}

运行 logstash 进程然后输入 "begin 123.456 end",你会看到类似下面这样的输出:

{
         "message" => "begin 123.456 end",
        "@version" => "1",
      "@timestamp" => "2014-08-09T11:55:38.186Z",
            "host" => "raochenlindeMacBook-Air.local",
    "request_time" => "123.456"
}

漂亮!不过数据类型好像不太满意……request_time 应该是数值而不是字符串。

我们已经提过稍后会学习用 LogStash::Filters::Mutate 来转换字段值类型,不过在 grok 里,其实有自己的魔法来实现这个功能!

Grok 表达式语法

Grok 支持把预定义的 grok 表达式 写入到文件中,官方提供的预定义 grok 表达式见:https://github.com/logstash/logstash/tree/v1.4.2/patterns

注意:在新版本的logstash里面,pattern目录已经为空,最后一个commit提示core patterns将会由logstash-patterns-core gem来提供,该目录可供用户存放自定义patterns

下面是从官方文件中摘抄的最简单但是足够说明用法的示例:

USERNAME [a-zA-Z0-9._-]+
USER %{USERNAME}

第一行,用普通的正则表达式来定义一个 grok 表达式;第二行,通过打印赋值格式,用前面定义好的 grok 表达式来定义另一个 grok 表达式。

grok 表达式的打印复制格式的完整语法是下面这样的:

%{PATTERN_NAME:capture_name:data_type}

小贴士:data_type 目前只支持两个值:int 和 float

所以我们可以改进我们的配置成下面这样:

filter {
    grok {
        match => {
            "message" => "%{WORD} %{NUMBER:request_time:float} %{WORD}"
        }
    }
}

重新运行进程然后可以得到如下结果:

{
         "message" => "begin 123.456 end",
        "@version" => "1",
      "@timestamp" => "2014-08-09T12:23:36.634Z",
            "host" => "raochenlindeMacBook-Air.local",
    "request_time" => 123.456
}

这次 request_time 变成数值类型了。

最佳实践

实际运用中,我们需要处理各种各样的日志文件,如果你都是在配置文件里各自写一行自己的表达式,就完全不可管理了。所以,我们建议是把所有的 grok 表达式统一写入到一个地方。然后用 filter/grok 的patterns_dir 选项来指明。

如果你把 "message" 里所有的信息都 grok 到不同的字段了,数据实质上就相当于是重复存储了两份。所以你可以用 remove_field 参数来删除掉 message 字段,或者用 overwrite 参数来重写默认的 message 字段,只保留最重要的部分。

重写参数的示例如下:

filter {
    grok {
        patterns_dir => "/path/to/your/own/patterns"
        match => {
            "message" => "%{SYSLOGBASE} %{DATA:message}"
        }
        overwrite => ["message"]
    }
}

小贴士

多行匹配

在和 codec/multiline 搭配使用的时候,需要注意一个问题,grok 正则和普通正则一样,默认是不支持匹配回车换行的。就像你需要 =~ //m 一样也需要单独指定,具体写法是在表达式开始位置加 (?m) 标记。如下所示:

match => {
    "message" => "(?m)\s+(?<request_time>\d+(?:\.\d+)?)\s+"
}

多项选择

有时候我们会碰上一个日志有多种可能格式的情况。这时候要写成单一正则就比较困难,或者全用 | 隔开又比较丑陋。这时候,logstash 的语法提供给我们一个有趣的解决方式。

文档中,都说明 logstash/filters/grok 插件的 match 参数应该接受的是一个 Hash 值。但是因为早期的 logstash 语法中 Hash 值也是用 [] 这种方式书写的,所以其实现在传递 Array 值给 match 参数也完全没问题。所以,我们这里其实可以传递多个正则来匹配同一个字段:

match => [
    "message", "(?<request_time>\d+(?:\.\d+)?)",
    "message", "%{SYSLOGBASE} %{DATA:message}",
    "message", "(?m)%{WORD}"
]

logstash 会按照这个定义次序依次尝试匹配,到匹配成功为止。虽说效果跟用 | 分割写个大大的正则是一样的,但是可阅读性好了很多。

最后也是最关键的,我强烈建议每个人都要使用 Grok Debugger 来调试自己的 grok 表达式。

转自:http://udn.yyuap.com/doc/logstash-best-practice-cn/filter/grok.html

 

分享到:
评论

相关推荐

    logstash grok(正则表达式)提取日志信息

    logstash grok 添加了自定义的正则表达式,可以提取出日志的等级,日志的时间,日志的线程号

    groktoregex:将 logstash grok 别名转换为正则表达式

    GrokToRegex 是一个简单的命令行实用程序,可将已知的 grok 别名转换为其相应的正则表达式值。 安装 要安装 GrokToRegex,请使用 go get go get github.com/jrxfive/groktoregex 用法 一旦构建 groktoregex 只需要...

    korg:根据可重用模式组合正则表达式(Python Logstash grok克隆)

    korg是ruby logstash grok正则表达式模式的python端口。 快速开始 Logstash带有100多种内置模式,用于构造非结构化数据。 在处理诸如apache,linux,haproxy,aws等之类的日志数据时,绝对应该利用此优势。 但是,...

    java-grok依赖jar包

    这里面提供日志解析的gork包和其相关的依赖包

    opengrok_tool.zip

    工具总要用来搭建ubuntu环境下的代码阅读工具openGrok 1. 下载资源,解压到一个空间比较大的磁盘目录下 2. cd opengrok_tool 执行 ./CreatOpenGrok $project_name $source_code_dir第一个参数是网页打开时的后缀,...

    OPENGROK 环境搭建

    使用OPENGROK可以非常快速的查看代码,整合了git的功能

    nginx的正则表达式,logstash用

    nginx的正则表达式,logstash用。grok是一种采用组合多个预定义的正则表达式,用来匹配分割文本并映射到关键字的工具。通常用来对日志数据进行预处理。

    grok提取日志信息例子

    grok提取日志信息的实际例子

    cheatsheet-python-grok

    cheatsheet python grok cheatsheet python grok cheatsheet python grok

    opengrok配置文档.zip

    opengrok环境搭建文档 包括索引生成的脚步 一般配置出问题可以尝试切换opengrok的版本

    Android代码-grok

    Grok Grok is simple tool that allows you to easily parse logs and other files (single line). With Grok, you can turn unstructured log and event data into structured data (JSON). Grok is an ...

    tomcat opengrok install package

    OpenGrok安装包 :opengrok-0.12.1.5.tar.gz Tomat 安装包:apache-tomcat-7.0.40.tar.gz

    docker opengrok镜像离线包

    opengrok镜像离线包,opengrok是一款开源的源代码检索,查看工具,资源为其docker镜像版打包,使用docker load进行加载,之后进行相关run操作启动服务,因为大小有限制,分段上传,下载之后请进行cat合并 成tar格式

    opengrok-1.2.23.tar.gz

    opengrok-1.2.23.tar 官网下载的资源

    Java正则表达式

    超级详细的Java正则表达式,包括普通规则,Group规则,以及Grok

    logstash-filter-grok-3.4.3

    logstash的filter插件,通过正则表达式拆解日志。安装方式:bin/logstash-plugin install --no-verify logstash-filter-grok-3.4.4.gem

    opengrok code search

    代码搜索,速度极快,尤其适合大型项目的代码搜索。以apache开源搜索引擎为基础,加tomcat可以极快搜索代码中的变量

    postfix-grok-patterns, 解析后缀日志记录的Logstash配置和grok模式.zip

    postfix-grok-patterns, 解析后缀日志记录的Logstash配置和grok模式 用于后缀日志的 Logstash注释模式一组使用grok解析后缀日志记录的grok模式。 还包括一个示例Logstash配置文件,用于将grok模式作为过滤器应用。...

    opengrok镜像离线包

    opengrok镜像离线包,opengrok是一款开源的源代码检索,查看工具,资源为其docker镜像版打包,使用docker load进行加载,之后进行相关run操作启动服务,因为大小有限制,分段上传,下载之后请进行cat合并 成tar格式

    grok_exporter, 从任意非结构化日志数据导出普罗米修斯.zip

    grok_exporter, 从任意非结构化日志数据导出普罗米修斯 grok_exporter从任意非结构化日志数据导出 Prometheus 。关于 Grok是一种工具,用来将无用的非结构化日志数据解析为结构和查询。 Grok在中大量使用,以提供...

Global site tag (gtag.js) - Google Analytics