【问题标题】:Logstash - parse data with grokLogstash - 用 grok 解析数据
【发布时间】:2020-11-10 21:12:14
【问题描述】:

TL;DR 在底部

我有一个自定义生成的日志文件,其中列出了用户运行的命令(以及其他一些东西)。为此,我有一个 grok 脚本,可以成功地将消息解析为字段。当我被要求添加一些生成不同时间戳的非常旧的服务器时,我开始遇到错误。

这是新服务器上的日志:

[2020-07-21 12:59:31] SERVER-DB-230 john:USER=root PWD=/root PID=[22714] CMD="echo test9" Exit=[0] CONNECTION=
[2020-07-21 12:59:33] SERVER-DB-230 john:USER=root PWD=/root PID=[22714] CMD="echo test10" Exit=[0] CONNECTION=
[2020-07-21 12:59:35] SERVER-DB-230 john:USER=root PWD=/root PID=[22714] CMD="clear" Exit=[0] CONNECTION=

这是旧服务器上的日志(不同的时间戳):

Jul 21 13:02:53 SERVER-DEV-NEW-167 root: USER=root PWD=/root PID=[10638] CMD="echo 2" Exit=[0] CONNECTION=1.2.3.4
Jul 21 13:02:54 SERVER-DEV-NEW-167 root: USER=root PWD=/root PID=[10638] CMD="echo 3" Exit=[0] CONNECTION=1.2.3.4
Jul 21 13:02:56 SERVER-DEV-NEW-167 root: USER=root PWD=/root PID=[10638] CMD="echo 4" Exit=[0] CONNECTION=1.2.3.4

由于这些是我拥有的日志的语法,我认为最好有一个“if”语句,说明 - 如果 grok 无法解析,请尝试使用此 grok 代码解析它。问题是,即使它们非常相似,我也无法让 grok 解析这些数据。我正在尝试让它与 grok 调试器一起工作,但我就是无法让它工作。

这是我当前在 logstash 中的 .conf:https://pastebin.com/QZv7zM1x

有谁知道如何将第二个代码块解析成字段?以及如何使它仅在第一个失败时才解析?先谢谢了!

TL;DR: 需要帮助来解析第二个日志块,只有在失败时才由 grok 解析

【问题讨论】:

    标签: linux elasticsearch logstash elastic-stack logstash-grok


    【解决方案1】:

    对于第二个块,这是一个非常懒惰的解决方案;如果您需要它更高效,那么 LMK。

    (?<ts>%{SYSLOGTIMESTAMP}) (?<hname>(\b[\w\-]+\b)) (?<loggedas>%{WORD}): USER=(?<user>%{WORD}) PWD=(?<pwd>(\/[\w]+)) PID=(?<pid>(\[[\d]+\])) CMD="(?<cmd>[\s\S]+)" Exit=(?<exit>(\[[\d]+\])) CONNECTION=(?<connection>([\d]+\.[\d]+\.[\d]+\.[\d]+))

    正如另一位用户所说,您可以让它尝试多种模式。

    语法是, grok { match => { "message" => [ "pattern1", "pattern2", "patternN" ] } }

    【讨论】:

    • 非常感谢!我忘了提到有时,“=”之后的“Connection=”是空的。此外,我真的很想自己学习做那种摸索,但我真的迷失了所有的正则表达式。你有什么指示吗?提前谢谢!
    • 对于 Connection= 问题,您可以这样做 [也许]:([\d]+\.[\d]+\.[\d]+\.[\d]+)|($) 我不会将其作为一个非常好的解决方案出售。这真的取决于你想如何处理它。回复:指针我自己对正则表达式很陌生;对我帮助很大的是使用在线工具来验证表达式。我经常使用link。这听起来几乎是陈词滥调,但解决我遇到的问题有很大帮助。
    • 我实际上已经找到了解决方案。因为是最后一个字段,所以我把它写成 %{GREEDYDATA}
    【解决方案2】:

    您可以定义多个 grok 模式,而不是 if 语句。

    grok {
      match => ["message", "pattern1", "pattern2"]
    }
    

    如果pattern1 失败,它将自动尝试应用pattern2

    就匹配第二种时间戳而言,它似乎是SYSLOGTIMESTAMP。您可以找到所有预定义的 grok 模式here

    【讨论】:

    • 看起来 github 上的预定义 grok 模式已移至以下文件夹:ecs-v1legacy
    猜你喜欢
    • 2021-03-31
    • 1970-01-01
    • 2015-12-18
    • 1970-01-01
    • 2017-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-24
    相关资源
    最近更新 更多