您如何将 Spring Boot 日志直接摄取到 Elastic 中

Posted

技术标签:

【中文标题】您如何将 Spring Boot 日志直接摄取到 Elastic 中【英文标题】:How do you ingest Spring boot logs directly into elastic 【发布时间】:2017-08-10 13:24:12 【问题描述】:

我正在研究将 Spring Boot 应用程序日志直接发送到 Elastic Search 的可行性。不使用 filebeats 或 logstash。我相信 Ingest 插件可能会对此有所帮助。

我最初的想法是通过 TCP 使用 logback 来做到这一点。

https://github.com/logstash/logstash-logback-encoder

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <appender name="stash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
      <destination>127.0.0.1:4560</destination>
      <encoder class="net.logstash.logback.encoder.LogstashEncoder" />
  </appender>

  <root level="DEBUG">
      <appender-ref ref="stash" />
  </root>
</configuration>

所以看上面你可以直接将日志发送到logstash。我只是想知道是否可以使用更新的摄取功能并跳过使用logstash?通过使用摄取方法通过网络将 json 编码的日志直接发送到 elastic 中?

https://www.elastic.co/blog/new-way-to-ingest-part-1

我的问题

我想知道这是否可能?如果是这样,你能解释一下你会怎么做。 还有什么可能的陷阱等等。

【问题讨论】:

TCP appender 不适合这种情况,因为您需要通过 HTTP 发送数据。我会查看 Loggly HTTP appender,它应该可以很好地完成工作:loggly.com/docs/java-logback 看起来不像是把它发送到弹性?也是一种付费产品 你当然可以更改URL发送到你自己的ES。请参阅the source code,它会将您的日志发送到您配置的任何 URL 【参考方案1】:

我刚刚尝试了我的建议,效果很好。

首先,在你的 POM 中添加这个依赖:

    <dependency>
        <groupId>org.logback-extensions</groupId>
        <artifactId>logback-ext-loggly</artifactId>
        <version>0.1.2</version>
    </dependency>

然后,在您的 logback.xml 配置中,添加一个附加程序和一个记录器,如下所示:

<appender name="ES" class="ch.qos.logback.ext.loggly.LogglyAppender">
    <endpointUrl>http://localhost:9200/tests/test?pipeline=logback</endpointUrl>
    <pattern>%m</pattern>
</appender>
<logger name="es" level="INFO" additivity="false">
    <appender-ref ref="ES"/>
</logger>

您还需要像这样定义一个摄取管道:

PUT _ingest/pipeline/logback

  "description": "logback pipeline",
  "processors": [
    
      "set" : 
        "field": "source",
        "value": "logback"
      
    
  ]

然后,在您的代码中,您可以使用该记录器并将您拥有的任何数据发送到您的 ES

private Logger esLogger = LoggerFactory.getLogger("es");
...
esLogger.info("\"message\": \"Hello World from Logback!\"");

这个文档最终会出现在你的 ES 中:


    "_index": "tests",
    "_type": "test",
    "_id": "AV3Psj5MF_PW7ho1yJhQ",
    "_score": 1,
    "_source": 
      "source": "logback",
      "message": "Hello World from Logback!",
    

【讨论】:

谢谢 Val.. 这真的很有帮助,它确实记录了消息 :-) 我如何扩展它以包含其他标准的常用日志字段,例如时间、主机、日志级别等,将使用 kibana理解日志。你也可以传入一个字符串而不是json编码字符串吗?【参考方案2】:

我之前问过同样的问题:Direct integration of Logback with Elasticsearch

看看https://github.com/internetitem/logback-elasticsearch-appender

更新 logback-elasticsearch-appender 的开发在 2017 年 10 月因breaking issues for ES v6.x

而停滞不前

【讨论】:

我相信这个问题现在已经解决了 它于 2019 年关闭。Maven Central 的最新版本是 2017 年。实际上它无法使用((mvnrepository.com/artifact/com.internetitem/… 感谢您的更新。有没有其他资源可以实现同样的目标?

以上是关于您如何将 Spring Boot 日志直接摄取到 Elastic 中的主要内容,如果未能解决你的问题,请参考以下文章

Spring引导微服务使用Graylog进行日志记录

[Docker容器内的Spring Boot应用程序的log4j2日志

如何在spring boot中配置log4j写入文件?

从 python 脚本将日志摄取到 bigquery

在写入时使用 Flume 将日志文件摄取到 HDFS

将 Spring Boot Profile 添加到 Sleuth/Zipkin 日志