Logstash可选字段

时间:2018-10-17 13:55:40

标签: regex logstash logstash-grok

我有这样的日志示例,其中正常运行时间并不总是一个字段:

Oct 17 08:41:33 host-name 2y40w: %SEC-6-IPACCESSLOGP: list 105 permitted tcp 1.2.3.4(17774) -> 0.0.0.0(22), 1 packet
Oct 17 13:32:26 host-name %SEC-6-IPACCESSLOGP: list 105 permitted tcp 1.2.3.4(56200) -> 0.0.0.0(22), 1 packet

如果我做这样的正则表达式:

   %{SYSLOGTIMESTAMP:log_server_timestamp} %{IPORHOST:cisco_host (%{DATA:uptime}:)? %{NOTSPACE:msgid}: \list %{NUMBER:acl} %{WORD:action} %{WORD:protocol} %{NOTSPACE:source}+\(%{DATA:src_port}\) \-> %{NOTSPACE:dest}+\(%{DATA:dest_port}\), %{NUMBER:packets}

之间有一个空格:

(%{DATA:uptime}:)? %{NOTSPACE:msgid}:

它将成功解析包含正常运行时间的日志,而不是没有正常运行时间的日志。

没有空格:

(%{DATA:uptime}:)?%{NOTSPACE:msgid}:

它将解析不包含正常运行时间的消息。

我对我的正则表达式有些生疏,所以希望有人能帮我弄清楚为什么不这样做,因为我真的不喜欢这样的条件字段应添加另一层嵌套的if语句的想法。可以在正则表达式中使用。

编辑:

也尝试过:

(?<uptime>[ywd0-9]+):

哪个也不起作用

1 个答案:

答案 0 :(得分:1)

您可以使用可选组将正常运行时间模式+空格的整个部分括起来:

%{SYSLOGTIMESTAMP:log_server_timestamp} %{IPORHOST:cisco_host}( %{DATA:uptime}:)? %{NOTSPACE:msgid}: \list %{NUMBER:acl} %{WORD:action} %{WORD:protocol} %{NOTSPACE:source}+\(%{DATA:src_port}\) \-> %{NOTSPACE:dest}+\(%{DATA:dest_port}\), %{NUMBER:packets}
                                                              ^^               ^^