我有这样的日志示例,其中正常运行时间并不总是一个字段:
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]+):
哪个也不起作用
答案 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}
^^ ^^