【问题标题】:Logstash and Multiline Log Entry from Cloud Foundry来自 Cloud Foundry 的 Logstash 和多行日志条目
【发布时间】:2015-07-27 15:59:46
【问题描述】:

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

这是来自 Cloud Foundry 的日志的 sn-p。在 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)

【问题讨论】:

  • 您能否为这些日志消息提供一个日志示例?如果每一行都有时间戳,作为一个人,您如何找到新的多行消息开始的指示?
  • @TomKregenbild 感谢您的关注。我从 Cloud Foundry 日志流中添加了一个 sn-p。
  • 嗨,我正在尝试做同样的事情,试图从下面列出的 Cloud Foundry 日志中获取时间戳、主机、请求者、响应时间、应用程序 ID、使用的代理和许多其他内容 2015-08-03T09:51 :15.000+00:00 [RTR] 输出 mm1-spring-music.example.com - [03/08/2015:09:51:15 +0000] "GET /assets/ HTTP/1.1" 200 428 "mm1--music.example.com " "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.125 Safari/537.36" XX.XX.XXX.XX" vcap_request_id:5ad0-f9-46a9-77-2095952faf78response_time: 0.002043376 app_id:08b8-c7-4613-bf12-1a 可以分享一下你用过的logstash.conf吗

标签: cloud-foundry logstash-grok


【解决方案1】:

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

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

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

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

【讨论】:

  • 感谢您的解决方案。如果有一个 Logstash 服务器,这很有效,但在多服务器环境中它不起作用,因为 Cloud Foundry 可以将每一行发送到不同的服务器。我想知道确保多行日志消息中的所有行都发送到同一个 Logstash 服务器是否更像是 Cloud Foundry 问题。
  • 您可以通过在将日志发送到 logstash 服务器的托运人上实现多行逻辑来解决此问题。您可以为此使用 Beaver shipper,并在我在“多行问题”下写的这篇文章的末尾阅读有关如何解决它的更多信息:logs101.com/the-message-broker-scaling-logstash-part-3
猜你喜欢
  • 2016-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多