目录
背景
技术架构
部署安装
环境准备
配置Logback并模拟产生日志
制作fluentd镜像
运行docker-compose
效果展示
背景
在现代的软件开发和运维领域,监控和日志管理是至关重要的任务。随着应用程序规模的扩大和分布式系统的普及,有效地跟踪和分析日志数据成为了挑战。Elasticsearch、Fluentd和Kibana(EFK)框架是一组流行的工具,可帮助您实现高效的日志收集、存储和分析。
本文将介绍采集SpringCloud Logback日志为例,使用Docker容器化技术快速部署EFK架构来满足您的监控和日志管理需求。
项目代码:GitHub - huangyang1230/springboot_efk: EFK采集Springboot日志并展示
技术架构
如图所示:
- 应用程序实时产生日志文件;
- Fluentd的tail组件采集并使用multiline解析;
- 采集到的日志数据经过Fluentd的处理后,会被发送到Elasticsearch。Elasticsearch是一个高性能的搜索和分析引擎,用于存储和索引日志数据。Fluentd与Elasticsearch之间通常使用名为fluent-plugin-elasticsearch的插件来建立连接和传输数据。一旦数据到达Elasticsearch,它将自动建立索引,以便稍后的查询和分析;
- 使用Kibana查看、搜索、分析日志。
部署安装
环境准备
- docker和docker-compose 可以参考官方文档
配置Logback并模拟产生日志
logback-spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="false" scanPeriod="60 seconds" debug="false">
<springProperty scope="context" name="APP_NAME" source="spring.application.name" defaultValue="springBoot"/>
<property name="LOG_HOME" value="/usr/local/logs"/>
<property name="CONSOLE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %highlight(%-5level) %cyan(%logger{50}:%line) - %highlight(%msg) %n"/>
<property name="FILE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level [%logger{50}:%line] - %msg%n"/>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- Log file debug output -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/${APP_NAME}.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/%d{yyyy-MM}/${APP_NAME}-%d{yyyy-MM-dd}-%i.log.gz</fileNamePattern>
<maxFileSize>50MB</maxFileSize>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${FILE_LOG_PATTERN}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<logger name="java.sql.Connection" level="debug"/>
<logger name="java.sql.Statement" level="debug"/>
<logger name="java.sql.PreparedStatement" level="debug"/>
<!-- Level: FATAL 0 ERROR 3 WARN 4 INFO 6 DEBUG 7 -->
<root level="DEBUG">
<appender-ref ref="STDOUT"/>
<appender-ref ref="FILE"/>
</root>
</configuration>
Java代码模拟产生日志
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Component;
import java.util.UUID;
/**
* @author Yang Huang
* @create 2023-10-21-11:21
* @description TODO
*/
@Component
@Slf4j
public class LogFactory implements InitializingBean{
public void log() {
log.debug("开始记录日志");
while (true) {
log.debug("我是debug日志,{}", UUID.randomUUID().toString());
log.info("我是info日志,{}", UUID.randomUUID().toString());
try {
int i = 1 / 0;
} catch (Exception e) {
log.error("产生了错误", e);
}
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
@Override
public void afterPropertiesSet() throws Exception {
log();
}
}
启动Springboot项目,让日志文件生成到/usr/local/logs目录下,下一步让fluentd实时采集。
制作fluentd镜像
由于官方fluentd镜像不包含fluent-plugin-elasticsearch插件,需要自定义镜像。Dockerfile文件内容:
FROM fluent/fluentd:v1.16-debian-1
# Use root account to use apt
USER root
# below RUN includes plugin as examples elasticsearch is not required
# you may customize including plugins as you wish
RUN buildDeps="sudo make gcc g++ libc-dev" \
&& apt-get update \
&& apt-get install -y --no-install-recommends $buildDeps \
&& sudo gem install fluent-plugin-elasticsearch \
&& sudo gem sources --clear-all \
&& SUDO_FORCE_REMOVE=yes \
apt-get purge -y --auto-remove \
-o APT::AutoRemove::RecommendsImportant=false \
$buildDeps \
&& rm -rf /var/lib/apt/lists/* \
&& rm -rf /tmp/* /var/tmp/* /usr/lib/ruby/gems/*/cache/*.gem
#COPY fluent.conf /fluentd/etc/
#COPY entrypoint.sh /bin/
USER fluent
在Dockerfile目录运行以下命令:
docker build -t fluentd_es:v1 .
运行docker-compose
一、文件目录准备
fluentd
fluent.conf
docker-compose.yml
二、 fluent.conf内容
<source>
@type tail # 内置的输入方式,从源文件中获取新的日志。
path /usr/local/logs/*.log # 挂载的服务器 Docker 容器日志地址
pos_file /usr/local/logs/*.log.pos
tag test.* # 设置日志标签
read_from_head true
<parse>
@type multiline
format_firstline /\d{4}-\d{1,2}-\d{1,2}/ #匹配日期开头
format1 /^(?<time>\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d{3}) \[(?<thread>[^\]]+)\] (?<level>[^\s]+) (?<message>.*)/
</parse>
</source>
<match **>
@id elasticsearch # 唯一标识符
@type elasticsearch # elasticsearch 插件
# @log_level info
host "192.168.0.110" #需要配置你IP
port "9200"
user "elastic"
password "B6P0hW7x"
logstash_format true
logstash_prefix test
logstash_dateformat %Y-%m-%d
include_tag_key true
tag_key @log_name
<buffer>
@type file # 使用文件将缓冲区块存储在磁盘上
path /usr/local/logs/fluentd.buffer
flush_mode interval
retry_type exponential_backoff
flush_thread_count 2
flush_interval 5s
retry_forever
retry_max_interval 30
overflow_action block
</buffer>
</match>
三、 docker-compose.yml 内容
version: "3.8"
#网络配置
networks:
network:
ipam:
config:
- subnet: "10.10.10.0/24"
#服务配置
services:
#es服务
elasticsearch:
image: elasticsearch:7.14.0
container_name: es
privileged: true
environment:
ES_JAVA_OPTS: -Xms1g -Xmx1g
node.name: es-single
cluster.name: es-cluster
discovery.type: single-node
# 开启es跨域
http.cors.enabled: "true"
http.cors.allow-origin: "*"
http.cors.allow-headers: Authorization
# 安全控制(根据个人需要选择打开或关闭)
xpack.security.enabled: "true"
xpack.security.transport.ssl.enabled: "true"
ELASTIC_PASSWORD: "B6P0hW7x"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- ./es/data:/usr/share/elasticsearch/data
- ./es/plugins:/usr/share/elasticsearch/plugins
- ./es/logs:/usr/share/elasticsearch/logs
ports:
- "9200:9200"
- "9300:9300"
## 指定ip
networks:
network:
ipv4_address: 10.10.10.100
#kibana
kibana:
image: kibana:7.14.0
restart: always
container_name: kibana
ports:
- "5601:5601"
depends_on:
- elasticsearch
environment:
ELASTICSEARCH_HOSTS: '["http://192.168.0.110:9200"]'
ELASTICSEARCH_USERNAME: 'elastic'
ELASTICSEARCH_PASSWORD: 'B6P0hW7x'
## 指定ip
networks:
network:
ipv4_address: 10.10.10.120
#fluentd
fluentd:
image: fluentd_es:v1
container_name: fluentd
restart: always
environment:
TZ: "Asia/Shanghai"
volumes:
- ./fluentd:/fluentd/etc
#左边/usr/local/logs是你应用生成日志的路径,根据实际情况调整
- /usr/local/logs:/usr/local/logs
depends_on:
- elasticsearch
## 指定ip
networks:
network:
ipv4_address: 10.10.10.130
注意:以上脚本中 "192.168.0.110"需要改成本地IP
最后运行命令启动容器:
docker-compose up -d
效果展示
一、打开http://localhost:5601/login?next=%2F登录,账号密码在脚本中。
二、创建索引
三、查看索引数据
至此,你可以在Kibana中查看应用日志。文章来源:https://www.toymoban.com/news/detail-777761.html
完结!!!文章来源地址https://www.toymoban.com/news/detail-777761.html
到了这里,关于(实战)docker-compose部署分布式日志方案EFK(Elasticsearch+Fluentd+Kibana)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!