Logstash - 使用 grok 解析数据
Logstash - parse data with grok
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 仅在失败时解析它
您可以定义多个 grok 模式,而不是 if
语句。
grok {
match => ["message", "pattern1", "pattern2"]
}
如果 pattern1
失败,它将自动尝试应用 pattern2
。
就匹配第二种类型的时间戳而言,它似乎是 SYSLOGTIMESTAMP
。您可以找到所有预定义的 grok 模式 here.
这是第二个块的真正懒惰的解决方案;如果您需要它更高效,那么 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" ] } }
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 仅在失败时解析它
您可以定义多个 grok 模式,而不是 if
语句。
grok {
match => ["message", "pattern1", "pattern2"]
}
如果 pattern1
失败,它将自动尝试应用 pattern2
。
就匹配第二种类型的时间戳而言,它似乎是 SYSLOGTIMESTAMP
。您可以找到所有预定义的 grok 模式 here.
这是第二个块的真正懒惰的解决方案;如果您需要它更高效,那么 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" ] } }