Spring Boot和ELK

时间:2019-02-04 16:46:05

标签: spring-boot docker elastic-stack

我有一系列使用Spring Boot构建的微服务,它们作为带有docker-compose的docker容器运行。我想集中日志文件,因此我正在考虑使用ELK(在另一个容器中运行)。我如何将日志文件从基于Spring Boot的Docker容器中获取到ELK,它们是从容器中推送到ELK还是相反?

任何示例配置或最新的库将不胜感激。

3 个答案:

答案 0 :(得分:1)

您可以使用Data Collector将数据从源发送到ELK。

其中一个就是Filebeat

让我们假设您有一个在Ubuntu Server之上运行的Spring-boot应用程序。

假设您已将应用程序配置为将日志存储在/ home / user / log /文件夹中。

现在将发送此日志数据到ELK。

1。您需要安装Filebeat

curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.6.0-amd64.deb
sudo dpkg -i filebeat-6.6.0-amd64.deb

更多详细信息here

2。打开Filebeat conf并添加您的日志位置。

sudo nano /etc/filebeat/filebeat.yml


filebeat.inputs:
- type: log
  enabled: true // enable this
  paths:
    - /var/log/*.log
    - /home/user/log/*.log // add your log path

在同一文件的Elastic / Logstash和Kibana部分中更改ELK的IP。

注意:您可以启用对Elastic或Logstash的输出,因此无需注释任何部分。 我建议先尝试弹性。

3。启动Filebeat以发送日志。

注意:ELK服务器应该已启动并正在运行,并且可以从您的Spring Boot服务器访问。

开始

sudo filebeat -e

如果一切都很好,您应该会看到filebeat日志说

Harvesting Data from your log path.
  1. 刷新Kibana仪表板并开始查看日志。默认情况下,创建的索引为filebeat-*

答案 1 :(得分:1)

两个问题:

  1. 您不想解析日志文件。因为没有人愿意编写正则表达式进行解析,所以容易出错。
  2. 如果您使用更加动态的容器设置,则由于所有绑定安装的目录或文件的设置都是PITA,因此您不想登录到文件。

要解决第一个问题,请添加日志附加程序以记录到JSON。我在这里使用Logback,您需要添加net.logstash.logback:logstash-logback-encoder依赖项:

<appender name="json" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${LOG_PATH:-.}/your-app-name.json</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <fileNamePattern>your-app-name.json.%d{yyyy-MM-dd}.gz</fileNamePattern>
        <maxHistory>7</maxHistory>
    </rollingPolicy>
    <encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
        <providers>
            <mdc/>
            <timestamp>
                <timeZone>UTC</timeZone>
            </timestamp>
            <pattern>
                <pattern>
                    {
                    "log.level": "%level",
                    "service.name": "${springAppName:-}",
                    "process.pid": "${PID:-}",
                    "thread": "%thread",
                    "class": "%logger",
                    "mdc": "%mdc",
                    "message": "%message"
                    }
                </pattern>
            </pattern>
        </providers>
    </encoder>
</appender>

然后您可以收集该文件并将其发送到Elasticsearch;所有字段都将被很好地提取,并且您的多行日志语句(如stacktraces)也不会被破坏:

filebeat.inputs:

# Collect the JSON log files from the Spring Boot apps
- type: log
  paths:
    - /var/log/apps/*.json
  json.keys_under_root: true
  json.add_error_key: true

output.elasticsearch:
  hosts: ["{{ elasticsearch_host }}"]

第二个问题有些棘手。我将使用Docker提供的默认JSON日志,因此您的Java应用程序可以简单地登录到控制台:

<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] %-5level %logger{36} [%thread] - %mdc - %msg %n</pattern>
        <charset>utf8</charset>
    </encoder>
</appender>

然后Filebeat可以自动收集所有Docker日志(Filebeat将需要访问/var/lib/docker/containers:/var/lib/docker/containers:ro才能起作用)

filebeat.autodiscover:
  providers:
    - type: docker

为了避免第一部分中的解析问题,实际上您需要将JSON登录到控制台,然后收集它。

答案 2 :(得分:0)

您可以使用以下架构,

Spring boot应用程序-> Kafka-> ELK

对于这种架构, 1.在Log4j xml文件上配置Kafka附加程序。然后,日志会自动推送到Kafka主题。 2.在Kafka主题上将Log-stash配置配置为订户。 3.以及您可以在Log-stash上使用任何过滤器。

ref:https://www.devglan.com/apache-kafka/stream-log4j-logs-to-kafka