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

时间:2015-08-31 00:10:22

标签: java logging elasticsearch logstash elastic-stack

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

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

在切线相关的注释中,对于在Docker容器中运行的应用程序,最好是直接登录ElasticSearch,只需要运行一个进程吗?

4 个答案:

答案 0 :(得分:7)

如果您真的想沿着这条路走下去,那么我们的想法就是使用类似Elasticsearch appender(或this onethis other one)的内容,将您的日志直接发送到您的ES群集。

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

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

另请注意,在官方ES讨论论坛中有关于此主题的ongoing discussion

答案 1 :(得分:2)

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

还有https://github.com/elastic/java-ecs-logging,它提供了log4j,log4j2和Logback的布局。这非常有效,Filebeat配置非常少。

免责声明:我是这个图书馆的作者。