【问题标题】:Logstash grok & regex filterLogstash grok 和正则表达式过滤器
【发布时间】:2020-04-09 08:39:58
【问题描述】:

想要一个从日志消息中提取给定信息的过滤器。

目前正在使用,尽管它非常特定于一种格式/日志布局

filter {
  if "ONT" in [message] {
   grok{
      match => { "message" => "%{SYSLOGBASE} %{WORD:Alarm_Severity} %{DATA:Message} %{QS:ONT_ID} %{DATA:Time} %{QS:ONT_Message}" }
   }
 }

日志文件是:

Dec 16 15:01:13 172.20.x.xx NPF_OLT_LAB05: clear Alarm for card 1/1 at 2019/12/16 15:01:13.39: "Backup files exist"
Dec 16 15:01:13 172.20.x.xx NPF_OLT_LAB05: service "403
 for ONT: "10002" - ONT needs restart at 2019/12/16 15:01:13.39 ONT message: "Backup files exist"

想要布局给我这些参数 时间:15:01:13

主机:NPF_OLT_LAB05

警报严重性:清除

ONT ID:10002

源 IP:172.20.x.xx

ONT 消息:“备份文件存在”

消息:清除卡 1/1 的警报

服务 ID:403

【问题讨论】:

    标签: regex logstash logstash-grok elk


    【解决方案1】:

    我猜这是两个不同的日志,你需要有两个不同的 grok 模式,如下所示,

    Dec 16 15:01:13 172.20.12.12 NPF_OLT_LAB05: clear Alarm for card 1/1 at 2019/12/16 15:01:13.39: "Backup files exists"

    Grok 模式

    (?<Date>%{MONTH} +%{MONTHDAY}) %{TIME:Time} %{IPV4:SourceIP} %{NOTSPACE:HOST}\:\s(%{WORD:Severity} %{GREEDYDATA:Message})\s(?<timestamp>%{YEAR}\/%{MONTHNUM}\/%{MONTHDAY}\s%{TIME})\S\s\S%{GREEDYDATA:ONTMessage}\"
    

    Dec 16 15:01:13 172.20.x.xx NPF_OLT_LAB05: service "403 for ONT: "10002" - ONT 需要在 2019/12/16 15:01:13.39 重启 ONT 消息:“备份文件存在”

    Grok 模式

    (?<Date>%{MONTH} +%{MONTHDAY}) %{TIME:Time} %{IPV4:SourceIP} %{NOTSPACE:HOST}\S\s%{WORD:Severity}\s\S%{BASE10NUM:ServiceID} %{NOTSPACE}\s(?:ONT: \S%{BASE10NUM:ONT_ID}\S) %{NOTSPACE} %{GREEDYDATA:Message}\s(?<timestamp>%{YEAR}\/%{MONTHNUM}\/%{MONTHDAY}\s%{TIME}) (?:ONT message\: \S(?<ONT Message:>%{GREEDYDATA}\S))
    

    低于标准

     filter {
          if "ONT" in [message] {
           grok{
              match => { "message" => [ "(?<Date>%{MONTH} +%{MONTHDAY}) %{TIME:Time} %{IPV4:SourceIP} %{NOTSPACE:HOST}\:\s(%{WORD:Severity} %{GREEDYDATA:Message})\s(?<timestamp>%{YEAR}\/%{MONTHNUM}\/%{MONTHDAY}\s%{TIME})\S\s\S%{GREEDYDATA:ONTMessage}\"" , 
                                      "(?<Date>%{MONTH} +%{MONTHDAY}) %{TIME:Time} %{IPV4:SourceIP} %{NOTSPACE:HOST}\S\s%{WORD:Severity}\s\S%{BASE10NUM:ServiceID} %{NOTSPACE}\s(?:ONT: \S%{BASE10NUM:ONT_ID}\S) %{NOTSPACE} %{GREEDYDATA:Message}\s(?<timestamp>%{YEAR}\/%{MONTHNUM}\/%{MONTHDAY}\s%{TIME}) (?:ONT message\: \S(?<ONT Message:>%{GREEDYDATA}\S))" ]
              }
           }
         }
    

    【讨论】:

    • 与其做一个长模式,不如在同一个 grok 过滤器中使用两种不同的模式可能是一个更好的主意。或者,如果有一种简单的方法可以区分这两种格式,则可以使用以下方法:if ... { grok { match =&gt; pattern1} } else { grok { match =&gt; pattern2 } }
    • 上述 grok 过滤器有两种不同的模式,用逗号分隔。 grok { match => { "message" => "pattern1" , "pattern2" }}
    • 我错过了。在这种情况下,我通常会在逗号后放置一个换行符,以便可以看到有两种模式。
    • 另外,当使用多个模式时,您需要将它们放在括号中:"message" =&gt; [ "pattern1" , "pattern2"] See the second example in the doc there.
    • 是否可以使用正则表达式来挑选单个单词,即“ONT ID”:---- 因为我将使用不同类型的日志消息logstash,它将从我的网络上的各种来源收集系统日志信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-24
    • 2014-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-18
    相关资源
    最近更新 更多