从Java应用程序登录到ELK而无需解析日志

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

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

在切向相关的注释中,对于在Docker容器中运行的应用程序,最佳做法是直接登录到ElasticSearch,因为只需要运行一个进程?

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

如果您真的想沿着这条路走下去,那么我们的想法就是使用像Elasticsearch appender (或者这个或另一个 )这样的东西,它可以将您的日志直接发送到您的ES集群。

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

存在异步性的原因有很多,其中一个原因是您的体系结构的健壮性,而且大部分时间比在日志解析上多烧几个CPU周期更重要。

另请注意,正式的ES讨论论坛正在讨论这个主题。

如果你需要一个快速的解决方案我在这里写了这个appender Log4J2 Elastic REST Appender如果你想使用它。 它能够在将事件发送到Elastic之前根据时间和/或事件数缓冲日志事件(使用_bulk API,以便一次性发送它)。 它已经发布到Maven Central,所以它非常直接。

正如其他人已经提到的那样,最好的方法是将其保存到文件中,然后将其单独发送给ES。 但是我认为,如果您需要快速运行,直到您有时间/资源实现最佳方式,那么就有价值。

Interesting Posts