`

[转]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 只需要...

    ElasticSearch7.3学习---logstash三大插件(input、filter、output)及其综合示例.doc

    Grok插件是Logstash中的正则捕获插件,负责对非结构化日志数据进行解析,并将其转换为结构化的数据。Grok插件使用正则表达式来匹配日志数据,并将其解析为结构化的数据。 Output插件 Output插件是Logstash中的...

    java-grok依赖jar包

    Grok的核心概念是模式,这些模式是由一系列预定义的或者自定义的正则表达式组成的。预定义模式通常包括常见的日志格式元素,如IP地址、时间戳、HTTP方法等。开发者可以根据需要组合和扩展这些模式,以适应特定的日志...

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

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

    Grok:深入解析日志与数据的强大工具.zip

    尽管Grok功能强大,但过度依赖正则表达式可能导致性能问题,因为正则表达式的匹配过程可能相对耗时。为了提高效率,可以采用缓存策略,将常用的Grok模式编译成Java代码,或者利用预编译的模式库。此外,合理设计和...

    OPENGROK 环境搭建

    3. **丰富的搜索选项**:支持多种高级搜索功能,包括但不限于全文搜索、正则表达式搜索等。 4. **跨语言支持**:支持多种编程语言的源代码,包括C、C++、Java、Python等。 5. **版本控制集成**:与Git等版本控制系统...

    logstash-filter-grok-4.0.4.zip

    Grok 的工作原理类似于正则表达式,但提供了更丰富的语法和灵活性,允许处理复杂的日志格式。 1. **Grok 模式和语法** Grok 使用一种特定的语法,其中包括百分号 `%{PATTERN}` 来表示预定义或自定义的模式。例如,...

    logstash-filter-grok-4.3.0.tar.gz

    Grok 是 Logstash 中一个强大的正则表达式匹配库,它包含了一套预定义的模式(也称为模板或者模式匹配器),这些模式可以帮助解析常见的日志格式。例如,Grok 可以识别 Web 服务器日志、数据库日志甚至是自定义的...

    opengrok-1.2.23.tar.gz

    Opengrok是一款强大的开源源代码搜索引擎和分析工具,它能够帮助开发者快速地在大型代码库中定位和理解代码。这个“opengrok-1.2.23.tar.gz”文件是Opengrok的1.2.23版本,来源于官方网站,意味着它是官方发布的稳定...

    tomcat opengrok install package

    《OpenGrok与Tomcat集成安装详解》 OpenGrok是一款强大的源代码搜索引擎,它能够帮助开发者快速定位和理解源代码中的函数、变量、类等元素。而Apache Tomcat则是一个广泛使用的Java应用服务器,主要用于部署和运行...

    opengrok_tool.zip

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

    opengrok配置文档.zip

    Opengrok是一款强大的开源源代码搜索引擎和导航工具,它能够帮助开发者快速地在大型代码库中定位和理解代码。本文将详细介绍如何配置和搭建Opengrok环境,包括索引生成的步骤以及解决常见配置问题的方法。 一、Open...

    opengrok镜像离线包

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

    opengrok-1.2.24.tar.gz

    **OpenGrok** 是一个强大的源代码搜索引擎和分析工具,主要设计用于帮助软件开发者快速查找、理解和探索大型代码库。它的功能包括代码搜索、交叉引用、语法高亮、源码浏览以及版本控制集成等,极大地提高了开发者的...

    opengrok-1.2.21.tar.gz

    《OpenGrok:源代码搜索和导航工具深度解析》 OpenGrok,作为一个开源的、强大的源代码搜索和导航工具,被广泛应用于大型项目中,它使得开发者能够快速有效地理解和探索复杂的代码库。本文将围绕“opengrok-1.2.21....

    搭建Opengrok看源码文件.zip

    Opengrok是一款强大的开源代码搜索和导航工具,它允许开发者快速地在大型代码库中查找、理解和探索源代码。本文将详细介绍如何搭建Opengrok来查看源码文件,以及涉及的相关环境配置。 首先,我们需要准备以下三个...

    nginx的正则表达式,logstash用

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

Global site tag (gtag.js) - Google Analytics