Docker搭建ELK日志系统


ELK是Elasticsearch、Logstash、Kibana的简称,这三者是核心套件实现日志采集、分析、展示,但并非全部。Elasticsearch官网地址

Elasticsearch是实时全文搜索和分析引擎,提供搜集、分析、存储数据三大功能;是一套开放REST和JAVA API等结构提供高效搜索功能,可扩展的分布式系统。它构建于Apache Lucene搜索引擎库之上。

Logstash是一个用来搜集、分析、过滤日志的工具。它支持几乎任何类型的日志,包括系统日志、错误日志和自定义应用程序日志。它可以从许多来源接收日志,这些来源包括 syslog、消息传递(例如 RabbitMQ)和JMX,它能够以多种方式输出数据,包括电子邮件、websockets和Elasticsearch。

Kibana是一个基于Web的图形界面,用于搜索、分析和可视化存储在 Elasticsearch指标中的日志数据。它利用Elasticsearch的REST接口来检索数据,不仅允许用户创建他们自己的数据的定制仪表板视图,还允许他们以特殊的方式查询和过滤数据。

下面我们是分别在3台服务器上搭建的。

安装elasticsearch

拉取镜像

docker pull elasticsearch:7.6.0

Elasticsearch默认是集群模式,集群模式下对机器配置较高;因此我们这里使用单机版的部署作为示例。下面是启动命令:

docker run -d --restart=always --name es7 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.0

之后通过9200端口在浏览器上访问http://192.168.56.102:9200(需要开启外网访问权限),有信息返回则成功;像下面的信息:

{
  "name" : "node-1",
  "cluster_name" : "docker-cluster",
  "cluster_uuid" : "7jUr1QFPQcSbDGG4A4c5Og",
  "version" : {
    "number" : "7.6.0",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "7f634e9f44834fbc12724506cc1da681b0c3b1e3",
    "build_date" : "2020-02-06T00:09:00.449973Z",
    "build_snapshot" : false,
    "lucene_version" : "8.4.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

注意:如果需要添加插件时,需要将容器的插件目录映射到实际的路径中或者通过命令(如安装ik分词器:docker cp ik elasticsearch:/usr/share/elasticsearch/plugins/)将其拷贝到容器中
如果机器内存过小会导致启动失败,在集群模式下容易遇到

安装kibana

kibana主要用于对elasticsearch的数据进行分析查看。注意选择的版本必须和elasticsearch的版本相同或者低,建议和elasticsearch的版本相同,否则会无法将无法使用kibana。

拉取kibana的docker镜像

docker pull kibana:7.6.0

创建kibana的配置:

mkdir -p /home/elk/config
vi /home/elk/config/kibana.yml

在里面添加如下配置

# Default Kibana configuration for docker target
server.name: kibana
server.host: "0"
# elasticsearch的地址,多个使用逗号分割
elasticsearch.hosts: [ "http://192.168.56.102:9200" ]
xpack.monitoring.ui.container.elasticsearch.enabled: true
# 语言选择为中文
i18n.locale: "zh-CN"

启动kibana:

docker run -d --restart=always --name kibana -v /home/elk/config/kibana.yml:/usr/share/kibana/config/kibana.yml -p 5601:5601 kibana:7.6.0

启动成功后访问5601端口即可进入kibana管理界面http://192.168.56.104:5601 。(进入后要求选择配置,直接选择自己浏览即可)

操作说明

刚进入系统时会有如下提示,任意选择即可:

创建索引模式,以便我们可以查看日志信息;



安装Logstash

logstash会将收到的日志信息推送到elasticsearch中。

拉取Logstash的镜像

docker pull logstash:7.6.0

创建logstash的日志处理配置文件logstash.conf

mkdir -p /home/elk/config
vi /home/elk/config/logstash.conf

添加如下配置:

input {

  tcp{
    port => 5044
    codec => json_lines
  }
}
filter {
       mutate {
         remove_field => ["logLevel", "stdoutOpen", "useLogStash", "logStashDestination"]
       }
}
output {

  #stdout {
  #  codec => rubydebug
  #}

  elasticsearch {
    hosts => ["192.168.56.105:9200"]
    index => "logstash-%{[env]}-%{[server_name]}-%{+YYYY.MM.dd}"
  }
}

创建logstash的的es配置文件logstash.yml

vi /home/elk/config/logstash.yml

添加如下配置:

http.host: "0.0.0.0"
xpack.monitoring.elasticsearch.hosts: [ "http://192.168.56.102:9200" ]

启动logstash,如果控制台没有错误日志信息则说明启动

docker run -di --restart=always -p 5044:5044 -v /home/elk/config/logstash.conf:/usr/share/logstash/pipeline/logstash.conf -v /home/elk/config/logstash.yml:/usr/share/logstash/config/logstash.yml --name logstash logstash:7.6.0

Spring Boot中集成logstash

下面以springboot中使用logback作为日志处理工具;为了和各个环境兼容,我们采用动态日志配置的方式,因此需要挺添加如下依赖:

<!-- logstash需要的包 -->
<dependency>
  <groupId>net.logstash.logback</groupId>
  <artifactId>logstash-logback-encoder</artifactId>
  <version>6.3</version>
</dependency>
<!-- 动态日志配置功能需要的包 -->
<dependency>
  <groupId>org.codehaus.janino</groupId>
  <artifactId>janino</artifactId>
</dependency>

配置文件application.yml

spring:
  application:
    name: elk-template
  profiles:
    active: dev
log-config:
  # 日志级别
  level: INFO
  # 控制台日志是否开启
  stdout: true
  logstash:
    # 是否启用logstash记录日志
    enable: true
    # logstash 地址
    destination: 192.168.56.105:5044

日志配置文件logback-spring.xml配置示例如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <springProperty scope="context" name="server_name" source="spring.application.name"/>
    <springProperty scope="context" name="env" source="spring.profiles.active"/>
    <springProperty scope="context" name="logLevel" source="log-config.level" defaultValue="INFO"/>
    <springProperty scope="context" name="stdoutOpen" source="log-config.stdout" defaultValue="true"/>
    <springProperty scope="context" name="useLogStash" source="log-config.logstash.enable" defaultValue="false"/>
    <springProperty scope="context" name="logStashDestination" source="log-config.logstash.destination" defaultValue=""/>

    <!-- 控制台输出 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %highlight(%-5level) %cyan(%logger{50}.%M.%L) - %highlight(%msg) %n</pattern>
        </layout>
    </appender>

    <if condition='property("useLogStash").equals("true")'>
        <then>
            <!--log stash 输出-->
            <appender name="STASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
                <destination>${logStashDestination}</destination>
                <encoder class="net.logstash.logback.encoder.LogstashEncoder">
                    <!-- 打印行号、方法名,官方不建议在生产环境开启此配置,默认为false(关闭),具网友测试开启后的耗时是未开启的大约360倍的时间(业务量小的时候可以忽略) -->
                    <!-- <includeCallerData>true</includeCallerData> -->
                    <!-- 设置时区-->
                    <timeZone>UTC</timeZone>
                    <!-- 日期格式化-->
                    <!-- <timestampPattern>yyyy-MM-dd'T'HH:mm:ss.SSS</timestampPattern>-->
                    <!-- 添加自定义属性,这里的server_name是服务名-->
                    <!-- <customFields>{"server_name":"demo-server"}</customFields> -->
                </encoder>
                <queueSize>16384</queueSize>
                <!-- 设置超时时间, 默认没有,使用集群的时候可以加上-->
                <!--<writeTimeout>30 seconds</writeTimeout>-->
            </appender>
            <root level='${logLevel}'>
                <if condition='property("stdoutOpen").equals("true")'>
                    <then>
                        <appender-ref ref="STDOUT"/>
                    </then>
                </if>
                <appender-ref ref="STASH"/>
            </root>
        </then>
        <else>
            <root level='${logLevel}'>
                <if condition='property("stdoutOpen").equals("true")'>
                    <then>
                        <appender-ref ref="STDOUT"/>
                    </then>
                </if>
            </root>
        </else>
    </if>
</configuration>

项目中日志打印还是和平时使用的一样即可。更详细的配置说明见官方文档: https://github.com/logstash/logstash-logback-encoder


特别提醒:扫码关注微信订阅号'起岸星辰',实时掌握IT业界技术资讯! 转载请保留原文中的链接!
 上一篇
2021年4月资讯(二) 2021年4月资讯(二)
2021年4月热门资讯:IntelliJ IDEA 2021.1 发布;抖音也能点餐了,抖音外卖在路上;4月数据库流行度排行榜:三巨头分数暴跌;OpenBSD 添加对协调火星时 (MTC) 的支持;伪造的jQuery Migrate插件生成恶意文件感染 WordPress网站
2021-04-09
下一篇 
插入排序 插入排序
插入排序,一般也被称为直接插入排序。对于少量元素的排序,它是一个有效的算法。插入排序是一种最简单的排序方法,它的基本思想是将一个记录插入到已经排好序的有序表中,从而一个新的、记录数增1的有序表。
2021-04-06
  目录