在LogStash

时间:2017-06-09 10:45:40

标签: logstash-grok logstash-configuration

在单个日志文件中,有两种格式的日志消息。首先如此:

Apr 22, 2017 2:00:14 AM org.activebpel.rt.util.AeLoggerFactory info
INFO:
======================================================
ActiveVOS 9.* version Full license.
Licensed for All application server(s), for 8 cpus,
License expiration date: Never.
======================================================

和第二:

Apr 22, 2017 2:00:14 AM org.activebpel.rt.AeException logWarning
WARNING: The product license does not include Socrates.

第一行是相同的,但在其他行上,可以(写成伪):
loglevel: <msg>或者loglevel:<newline><many of =><newline><multiple line msg><newline><many of =>

我有以下配置:
查询:

%{TIMESTAMP_MW_ERR:timestamp} %{DATA:logger} %{GREEDYDATA:info}%{SPACE}%{LOGLEVEL:level}:(%{SPACE}%{GREEDYDATA:msg}|%{SPACE}=+(%{GREEDYDATA:msg}%{SPACE})*=+)

Grok模式:

AMPM (am|AM|pm|PM|Am|Pm)
TIMESTAMP_MW_ERR %{MONTH} %{MONTHDAY}, %{YEAR} %{HOUR}:%{MINUTE}:%{SECOND} %{AMPM}

多行过滤器:

%{LOGLEVEL}|%{GREEDYDATA}|=+

问题在于所有邮件始终都标有%{SPACE}%{GREEDYDATA:msg},因此在第二种情况下,将<many of =>作为msg返回,而永远不会使用%{SPACE}=+(%{GREEDYDATA:msg}%{SPACE})*=+,可能是第一个{ {1}}模式包含第二个。

如何解析msg的这两种模式?

1 个答案:

答案 0 :(得分:0)

我通过以下方式修复它:
查询:

%{TIMESTAMP_MW_ERR:timestamp} %{DATA:logger} %{DATA:info}\s%{LOGLEVEL:level}:\s((=+\s%{GDS:msg}\s=+)|%{GDS:msg})

模式:

AMPM (am|AM|pm|PM|Am|Pm)
TIMESTAMP_MW_ERR %{MONTH} %{MONTHDAY}, %{YEAR} %{HOUR}:%{MINUTE}:%{SECOND} %{AMPM}
GDS (.|\s)*

多线模式:

%{LOGLEVEL}|%{GREEDYDATA}

正确解析日志。