我是 ELK 堆栈的新手,希望用它来调试日志文件中的问题。我的要求是绘制线程处理任务并返回到池所需的时间。基本上日志如下所示:
2014-10-31 13:00:00,007 [catalina-exec-11] DEBUG [com.clairmail.jms.concurrent.poolimpl.JMSProducerPoolImpl] Providing a pooled producer to catalina-exec-11
.....和
2014-10-31 13:00:00,121 [catalina-exec-11] DEBUG [com.clairmail.jms.concurrent.poolimpl.JMSProducerPoolImpl] catalina-exec-11 has returned producer to pool.
从上面的日志中,我可以发现这个特定的线程 catalina-exec-11 大约需要 107 毫秒才能完成。我的问题如下:
- 如何在 Kibana 中的图形上表示这一点?
- 我们有一个分布式架构,所以很可能在第二个实例中会出现一个 catalina-exec-11,如何将其与第一个实例区分开来?
- 在两台服务器上聚合,以查看处理线程的平均时间。
- 我的 grok 过滤器会是什么样子?
阿诺普
假设您可以更改日志的格式,以下提示可能对您有用:
- 据我所知
,无法(据我所知)计算 kibana 3.1(当前稳定版本)中两个不同弹性搜索文档的操作延迟。也许在 Kibana 4 中这是可能的。如果您的日志条目包含操作经过的时间,则您尝试执行的操作将微不足道。例如:
2014-10-31 13:00:00,007 0 [catalina-exec-11] DEBUG [com.clairmail.jms.concurrent.poolimpl.JMSProducerPoolImpl] 向 catalina-exec-11 提供池化生产者
2014-10-31 13:00:00,121 114 [catalina-exec-11] DEBUG [com.clairmail.jms.concurrent.poolimpl.JMSProducerPoolImpl] catalina-exec-11 已将生产者返回到池中。
请注意,我在日期之后添加了一个新的日志字段。然后,您可以绘制一个 kibana 直方图来显示该延迟字段的平均值。
-
因此,您有一个具有不同计算机的分布式体系结构,并且可能具有命名线程。您需要的是一个全局唯一的请求上下文 ID。有很多方法可以实现这一点:Guid,或一些Int64数字唯一id,类似于twitter雪花。使用这样的 id,您的日志将如下所示:
5892EAC3-EE95-4549-A787-CCE5A6639598 2014-10-31 13:00:00,007 0 [catalina-exec-11] DEBUG [com.clairmail.jms.concurrent.poolimpl.JMSProducerPoolImpl] 为 catalina-exec-11 提供池化生产者
5892EAC3-EE95-4549-A787-CCE5A6639598 2014-10-31 13:00:00,121 114 [catalina-exec-11] DEBUG [com.clairmail.jms.concurrent.poolimpl.JMSProducerPoolImpl] catalina-exec-11 已将生产者返回到池。
请注意,我在每个日志条目的开头添加了一个新的 guid 字段。
-
这很容易通过logstash来实现。如果 logstash 配置为从不同的机器读取日志文件,则文件输入会将一个新的"host"字段添加到 logstash 事件中,您可以将其发送到 elasticsearch。然后在 kibana 仪表板中,您可以轻松显示请求在不同机器之间的分布方式。
-
您的 grok 过滤器可能如下所示:格罗克{ match => [ "message", "%{UUID:requestid}%{SPACE}%{TIMESTAMP_ISO8601:timestamp}%{SPACE}%{NUMBER:ellapsedmilliseconds}%{SPACE}[{WORD:threadname}]%{SPACE}%{WORD:level}%{SPACE}[%{WORD:logger}]%{SPACE}%{WORD:logmessage}"]}
这只是一个例子,您必须根据需要对其进行微调。
希望有帮助。