基于Docker的ELK实践入门

143 阅读2分钟

ELK实践

github项目地址:github.com/zhaoweilong…

“ELK” 是三个开源项目的首字母缩写,这三个项目分别是:Elasticsearch、Logstash 和 Kibana。用来储存日志,分析日志,展示日志。

  • Elasticsearch 是一个搜索和分析引擎.
  • Logstash 是服务器端数据处理管道,能够同时从多个来源采集数据,转换数据,然后将数据发送到诸如 Elasticsearch 等“存储库”中。
  • Kibana 则可以让用户在 Elasticsearch 中使用图形和图表对数据进行可视化。
  • Beats,轻量型数据采集器 :Beats 平台集合了多种单一用途数据采集器。它们从成百上千或成千上万台机器和系统向 Logstash 或 Elasticsearch 发送数据。

ELK现在又叫做**Elastic Stack**,下面演示使用docker部署ELK,使用logstash收集Springboot日志,并在Kibana进行展示

docker部署

使用docker-compose部署

使用docker-elk项目部署,已经帮我们写好了脚本了,拿来即用

克隆项目

git clone https://github.com/deviantony/docker-elk.git

修改logstash的logstash.conf文件配置

input {
   beats {
      port => 5044
   }

   tcp {
       mode => "server"
      port => 5000
      codec => json_lines
   }
}

## Add your filters / logstash plugins configuration here

output {
   elasticsearch {
      hosts => "elasticsearch:9200"
      user => "elastic"
      password => "${LOGSTASH_INTERNAL_PASSWORD}"
      index => "spring-logstash-%{+YYYY.MM.dd}"
   }
}

input是logstash的输入,默认有beats,增加了tcp输入配置,通过tcp连接收集日志

output输出到elasticsearch中,其中输出到index索引为spring-logstash-开头就是存放日志的

在项目目录下启动运行

docker-compose up

正常包含了kibana、elasticsearch、logstash三个组件,extensions下包含扩展组件可以自行启动

如filebeat

docker-compose -f docker-compose.yml -f /extensions/filebeat/filebeat-compose.yml up

访问kibana:http://localhost:5601,默认用户elastic,密码在setup文件中.env文件配置的密码,默认是change,可自行更改

kibana首页

如果不是中文,可以更改kibana的配置文件

kibana/config//kibana.yml加入

i18n.locale: "zh-CN"

到这里elk基本部署完成,更多可以参考github.com/deviantony/…文档说明

收集springboot日志

项目配置

使用logstash收集springboot日志到elasticSearch中

新建springboot项目,加入以下依赖

dependencies {
    implementation('org.springframework.boot:spring-boot-starter-web')
    implementation 'net.logstash.logback:logstash-logback-encoder:7.1.1'
}

这是主要使用logstash-logback-encoder来进行集成logstash,项目地址:github.com/logfellow/l…

resources下新增logback-spring.xml配置文件,destination修改成自己地址

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/base.xml"/>
    <appender name="stash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <destination>192.168.2.56:5000</destination>
        <!-- encoder is required -->
        <!-- 日志输出编码 -->
        <encoder charset="UTF-8"
                 class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
            <providers>
                <timestamp>
                    <timeZone>GMT+8</timeZone>
                </timestamp>
                <pattern>
                    <pattern>
                        {
                        "logLevel": "%level",
                        "serviceName": "${springAppName:-}",
                        "pid": "${PID:-}",
                        "thread": "%thread",
                        "class": "%logger{40}",
                        "message": "%message"
                        }
                    </pattern>
                </pattern>
            </providers>
        </encoder>
    </appender>
    <root level="INFO">
        <appender-ref ref="stash"/>
        <appender-ref ref="CONSOLE"/>
    </root>
</configuration>

LogstashTcpSocketAppender就是tcp的方式

我再springboot增加了一个定时输出日志的任务


@SpringBootApplication
@Slf4j
@EnableScheduling
public class ElkApp {
    public static void main(String[] args) {
        SpringApplication.run(ElkApp.class, args);
    }

    @Scheduled(fixedRate = 1000)
    public void test() {
        log.info(Thread.currentThread().getName() + ": " + System.currentTimeMillis());
    }
}

启动应用,没有异常就代表启动正常了,如果提示连接失败,自己检查下IP端口配置有没有问题

在resource下我还新建了一个logback-access.xml用于收集事件日志,但是好像没生效,感兴趣的可以自己尝试下

chrome使用Elasticsearch-Head插件可以连接到es中,可以看到有一个spring-logstash-xxxx.xx.xx的索引,就是我们前面配置的索引名称

也可以安装Elasticvue插件查看

kibana数据展示

打开kibana,找到以下问题

新增一个数据试图

配置匹配规则。如spring-logstash-*,匹配所有以spring-logstash开头的索引

在discovery面板配置,可以展示数据,也可以自己配置数据面板

到这里ELK收集Springboot日志就完成了,你学废了嘛,不理解的地方建议大家多看官方文档,或者是官方文档的翻译版,我使用的ELK版本为当时最新的8.2.0版本