首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring Boot和ELK

Spring Boot和ELK
EN

Stack Overflow用户
提问于 2019-02-05 00:46:05
回答 3查看 2.5K关注 0票数 1

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

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

EN

回答 3

Stack Overflow用户

发布于 2019-02-15 10:59:50

两个问题:

  1. 您不想解析日志文件。因为没有人想要编写正则表达式来进行解析,而且容易出错。
  2. 如果您有一个更动态的容器设置,您不会想要记录到文件,因为所有绑定挂载的目录或文件的设置都是PITA。

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

代码语言:javascript
复制
<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;所有字段都将被很好地提取出来,并且您的多行日志语句(如stacktrace)也不会被分解:

代码语言:javascript
复制
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应用程序就可以简单地记录到控制台:

代码语言:javascript
复制
<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才能工作):

代码语言:javascript
复制
filebeat.autodiscover:
  providers:
    - type: docker

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

票数 3
EN

Stack Overflow用户

发布于 2019-07-29 12:19:06

你可以使用下面的架构,

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

对于这个架构,1.在Log4j xml文件上配置一个Kafka附加器。然后,日志会自动推送到Kafka主题。2.在Kafka topic上以订阅者身份配置Log-stash配置。3.以及您可以在Log-stash上使用任何过滤器。

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

票数 3
EN

Stack Overflow用户

发布于 2019-02-07 22:24:55

您可以使用数据收集器将数据从源发送到ELK。

其中之一就是Filebeat

假设你有一个运行在Ubuntu服务器上的Spring-boot应用程序。

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

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

1.您需要安装Filebeat

代码语言:javascript
复制
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并添加您的日志位置。

代码语言:javascript
复制
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.启动文件节拍以发送日志。

注意: ELK服务器应该已经启动并运行,并且可以从spring boot服务器访问。

开始

代码语言:javascript
复制
sudo filebeat -e

如果一切正常,您应该会看到filebeat日志说

代码语言:javascript
复制
Harvesting Data from your log path.

  1. 刷新Kibana仪表板并开始查看日志。默认情况下,创建的索引将为filebeat-*
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54520673

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档