一 准备

【附】博文:《Elasticsearch下载/安装/启动》
【附】博文:《Kibana下载/安装/启动》
【附】博文:《Logstash下载/安装/启动》

【注】Elasticsearch/Logstash/Kibana的版本必须完全相同!

二 编辑Logstash配置文件

    Logstash配置文件是指下载安装Logstash时自主创建的【conf】后缀文件,命名因人而异(官方文档中命名为:logstash-simple.conf)。

1.统一配置
# 配置输入端。
input {
  tcp {
    # 配置输入host。
    host => "localhost"
    # 配置输入端口。
    port => 5002
    # 设置服务器模式(具体作用未知)。
    mode => "server"
    # 设置输入内容为JSON(因此从此uri写入的内容必须是JSON格式)。
    codec => json_lines
  }
}
# 配置输出端。
output {
  # 配置输出至Elasticsearch。
  elasticsearch {
    # 配置Elasticsearch路由(可设置多个)。
    hosts => ["localhost:9200"]
    # 配置Elasticsearch索引,用于查询。
    index => "log-%{+yyyy.MM.dd}"
  }
}
2.分类配置
input {
  tcp {
    host => "localhost"
    port => 8001
    # 设置类型,如果想为不同服务的配置建立不同的索引,可设置此变量用于判断。
    type => "service-discovery-eureka"
    mode => "server"
    codec => json_lines
  }
  tcp {
    host => "localhost"
    port => 5002
    type => "service-basis-common"
    mode => "server"
    codec => json_lines
  }
}
output {
  # 判断类型,配置不同的Elasticsearch索引,以便区分不同服务的日志。
  if [type] == "service-discovery-eureka" {
    elasticsearch {
      hosts => ["localhost:9200"]
      index => "service-discovery-eureka-%{+yyyy.MM.dd}"
    }
  }
  if [type] == "service-basis-common" {
    elasticsearch {
      hosts => ["localhost:9200"]
      index => "service-basis-common-%{+yyyy.MM.dd}"
    }
  }
}

    配置完成后启动Logstash,启动命令:

nohup sh logstash -f logstash-simple.conf &

三 依赖

<!-- Logstash依赖 -->
        <dependency>
            <groupId>net.logstash.logback</groupId>
            <artifactId>logstash-logback-encoder</artifactId>
            <version>5.3</version>
        </dependency>

四 配置【logback-spring.xml】

    Spring Boot整合ELK的关键在于配置【logback-spring.xml】。

1.静态配置
<!--  Logstash全输出  -->
    <appender name="logstash_all" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <!--  destination标签中配置Logstash配置文件中设置的输入uri。  -->
        <destination>localhost:5002</destination>
        <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder"/>
    </appender>

    上述案例通过硬编码完成配置。但实际开发中会因为环境的不同使用不同的Logstash服务,因此需实现动态切换不同环境的Logstash服务。

2.动态配置:通过【springProfile】标签设置不同环境


logstash springboot_logstash springboot

<!--  Logstash全输出  -->
    <appender name="logstash_all" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <!--  设置本地环境Logstash输入uri  -->
        <springProfile name="loc">
            <destination>localhost:5002</destination>
        </springProfile>
        <!--  设置开发环境Logstash输入uri  -->
        <springProfile name="dev">
            <destination>12.34.56.78:5002</destination>
        </springProfile>
        <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder"/>
    </appender>
3.动态配置:通过【springProperty】标签设置不同环境(推荐)

    个人认为,对于需要根据环境产生变化的量(例如数据库连接,Redis连接等)最好是使用【application-env.yml】配置文件进行统一配置及管理,以达到简化配置的效果,无论是后期需要修改还是查阅都是最高效的方式。

【注】以下配置是个人行为,Logstash未提供官方配置模版!

# Logstash configuration
logstash:
  host: localhost
  port: 8001
<!--  Spring Boot参数(通过springProperty标签读取配置文件中的配置)  -->
    <springProperty scope="context" name="logstash.host" source="logstash.host"/>
    <springProperty scope="context" name="logstash.port" source="logstash.port"/>
    
    <!--  Logstash全输出  -->
    <appender name="logstash_all" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <!--  需要注意的是,LogstashTcpSocketAppender对于参数读取的支持有所不佳,直接使用  -->
        <!--  ${logstash.host}的方式读取数据会出现异常,因此需要使用${logstash.host:- }的方式进行读取,  -->
        <!--  【:-】的意思是如果变量存在则返回变量,否则返回默认值。  -->
        <!--  (很奇怪它怎么做到读取不到配置文件的值却又能将之作为默认值,反正就是成功了。)  -->
        <destination>${logstash.host:- }:${logstash.port:- }</destination>
        <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder"/>
    </appender>

    完成上述所有的配置后,启动服务,Logstash会通过输入uri接受来自各个服务的日志,并输出至Elasticsearch。

五 查询日志

1.启动服务


logstash springboot_spring boot_02

2.创建索引


logstash springboot_kibana_03

3.查询日志


logstash springboot_elasticsearch_04