Logstash 可选字段

Logstash Optional Fields

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

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}

与space之间:

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

包含uptime的日志会解析成功,没有uptime的日志不会解析。

没有 space 喜欢:

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

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

我对我的正则表达式有点生疏,所以希望有人能帮我弄清楚为什么这不起作用,因为我真的不喜欢在条件字段像这应该在正则表达式中可用。

编辑:

也试过:

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

哪个也不行

您可以将正常运行时间模式的整个部分 + 空格包含在可选组中:

%{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}
                                                              ^^               ^^