来自 Cloud Foundry 的 Logstash 和多行日志条目

Logstash and Multiline Log Entry from Cloud Foundry

我们正在将 CF 日志消息发送到 ELK 堆栈。多行日志消息在 Logstash 中被分解为多条日志消息。多行日志消息的每一行一端。当堆栈跟踪转储到日志时,这是有问题的。堆栈跟踪的每一行都被翻译成一条日志消息。试图通过 Kibana 查看它几乎是不可能的。 Logstash 提供了一个 Grok 特性,允许对日志消息进行操作。一种常见的解决方案是创建一个 Grok 过滤器,它使用时间戳来指示日志条目何时开始,并将直到下一个时间戳的所有行组合到一条日志消息中。问题是 CF 为每一行添加了时间戳。有没有人想出一个好的 Grok 表达式来处理来自 CF 的多行日志消息?

这是来自 Cloud Foundry 的日志片段。在 Logstash 中,每一行都被视为一条单独的日志消息

2015-07-24T10:37:59.93-0600 [App/0]      OUT  org.springframework.web.client.ResourceAccessException: I/O error on POST request for "http://11.11.11.11:9191/someendpoint":Connect to 11.11.11.11:9191 [/11.11.11.11] failed: Connection refused; nested exception is org.apache.http.conn.HttpHostConnectException: Connect to 11.11.11.11:9191 [/11.11.11.11] failed: Connection refused
2015-07-24T10:37:59.93-0600 [App/0]      OUT    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:580)
2015-07-24T10:37:59.93-0600 [App/0]      OUT    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:530)
2015-07-24T10:37:59.93-0600 [App/0]      OUT    at org.springframework.web.client.RestTemplate.postForLocation(RestTemplate.java:305)
2015-07-24T10:37:59.93-0600 [App/0]      OUT    at com.digitalglobe.p2020.eventservice.sendevent.EventSenderCommand.run(EventSenderCommand.java:104)

从您提供的日志中,我看到您有多行的第一条消息,然后其余消息在 OUT 部分后额外缩进了两个空格。

这意味着您应该能够使用以下模式捕获第一行

^%{TIMESTAMP_ISO8601}\s+\[%{DATA}]\s+\S+\s{2}\S

请注意,它不应该捕获前面的行,而只捕获第一行,如果您将 s{2} 的值更改为 s{4},您将捕获主行而不是第一行(相反你想要的)。