从 Java 应用程序记录到 ELK,无需解析日志

我想将日志从Java应用程序发送到ElasticSearch,传统的方法似乎是在运行该应用程序的服务器上设置Logstash,并让logstash解析日志文件(使用正则表达式...!)并将其加载到ElasticSearch中。

这样做是有原因的,而不仅仅是设置log4J(或logback)以所需的格式将内容直接记录到日志收集器中,然后可以异步发送到ElasticSearch?对我来说,当应用程序本身可以首先记录所需的格式时,不得不摆弄grok过滤器来处理多行堆栈跟踪(并在日志解析时刻录CPU周期)似乎很疯狂?

与此相关的是,对于在 Docker 容器中运行的应用,考虑到只需要运行一个进程,那么直接登录到 ElasticSearch 的最佳实践是否是?


答案 1

如果你真的想走这条路,我们的想法是使用像Elasticsearch追加器(或这个这个其他的)这样的东西,它将你的日志直接发送到你的ES集群。

但是,出于@Vineeth Mohan提到的相同原因,我建议不要这样做。您还需要问自己几个问题,但主要是如果您的ES集群因任何原因(OOM,网络关闭,ES升级等)而出现故障,会发生什么?

异步性存在的原因有很多,其中之一是体系结构的健壮性,大多数情况下,这比在日志解析中多刻录几个CPU周期更重要。

另请注意,在官方ES讨论论坛中正在进行有关此主题的讨论。


答案 2

我认为从Log4j/Logback/任何附加器直接登录到Elasticsearch通常是不明智的,但我同意编写Logstash过滤器来解析“正常”人类可读的Java日志也是一个坏主意。我使用 https://github.com/logstash/log4j-jsonevent-layout,让Log4j的常规文件追加器生成JSON日志,这些日志不需要Logstash进行任何进一步解析。


推荐