我有一系列使用Spring Boot构建的微服务,它们作为带有docker-compose的docker容器运行。我想集中日志文件,因此我正在考虑使用ELK(在另一个容器中运行)。我如何将日志文件从基于Spring Boot的Docker容器中获取到ELK,它们是从容器中推送到ELK还是相反?
任何示例配置或最新的库将不胜感激。
答案 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.
filebeat-*
答案 1 :(得分:1)
两个问题:
要解决第一个问题,请添加日志附加程序以记录到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