SpringCloud 分佈式日誌採集方案

由於微服務架構中每個服務可能分散在不同的服務器上,因此需要一套分佈式日誌的解決方案。spring-cloud 提供了一個用來 trace 服務的組件 sleuth。它可以通過日誌獲得服務的依賴關係。基於 sleuth,可以通過現有的日誌工具實現分佈式日誌的採集。

這裏使用的是 ELK,也就是 elasticsearch、logstash、kibana。

一、sleuth

第一步:sleuth 管理端

sleuth 一般單獨放在一個工程中。需要添加如下依賴

<dependency>  
        <groupId>io.zipkin.java</groupId>  
        <artifactId>zipkin-autoconfigure-ui</artifactId>  
        <scope>runtime</scope>  
    </dependency> 
      
    <dependency>  
        <groupId>io.zipkin.java</groupId>  
        <artifactId>zipkin-server</artifactId>  
    </dependency>

配置服務註冊中心的地址

eureka: 
  client: 
    serviceUrl: 
      defaultZone: http://localhost:1111/eureka/

啓動類加入服務發現的註解和 zipkin 的註解,如下

package com.wlf.demo;
 
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
 
import zipkin.server.EnableZipkinServer;
 
@EnableDiscoveryClient 
@EnableZipkinServer  
@SpringBootApplication  
public class Application {
   
    public static void main(String[] args) {  
        SpringApplication.run(Application.class, args);  
    }  
 
}

這個時候啓動並訪問該微服務的地址,可以看到 zipkin 的管理頁面了

第二步:被管理的微服務端

在我們的其他微服務端需要簡單的配置,納入到 zipkin 的管理之中

引入依賴

<dependency>  
         <groupId>org.springframework.cloud</groupId>  
         <artifactId>spring-cloud-starter-sleuth</artifactId>  
     </dependency>  
     
     <dependency>  
         <groupId>org.springframework.cloud</groupId>  
         <artifactId>spring-cloud-sleuth-zipkin</artifactId>  
     </dependency>

加入如下配置

spring: 
  sleuth: 
    sampler: 
       percentage: 1
  zipkin: 
    base-url: http://localhost:9411

spring.sleuth.sampler.percentage:這個參數的意思是抓取 100% 的日誌,只有通過抓取日誌,才能獲知依賴關係。但是如果始終抓取日誌的話對性能會有影響,因此可以自己配置。一般在開發環境,該值設置爲 1,生產環境視情況而定。

spring.zipkin.base-url:爲第一步配置的 zipkin 管理端微服務的地址

現在分別啓動服務註冊中心,網關,需要的微服務,以及 sleuth。

隨便調用一個微服務

然後我們可以看到相關的跟蹤日誌

同樣我們也可以看到微服務之間的依賴關係,這裏是通過網關調用了myservice-consumer-feign微服務,然後通過myservice-consumer-feign微服務調用了myservice-provider微服務

二、搭建 ELK

1、elasticsearch 的安裝與配置,由於之前的文章已經介紹了 elasticsearch 的單點,集羣的安裝,head 插件的安裝。這裏不再總結。

2、kibana 的安裝,沒什麼好說的,解壓,運行就可以了

3、logstash 的安裝,解壓即可

在 config 下新建配置文件

output {
input {
  tcp {
      port =4560
      codec => json_lines
  }
}
 
output {
  elasticsearch {
     hosts =["192.168.160.66:9200","192.168.160.88:9200","192.168.160.166:9200"]
     index ="applog"
  }
}

其中 port 爲端口號,codec 表示通過 json 格式,elasticsearch.hosts 表示 elasticsearch 的地址,這裏是集羣。index 爲日誌存儲的 elasticsearch 索引。

啓動需要調用 bin 下的 logstash 命令,通過 - f 指定配置文件

4、使用 kibana

啓動 elasticsearch、head、kibana、logstash

創建索引 applog

將 applog 配置到 kibana 中,在 index pattern 中輸入我們的 applog 索引

最後點擊 create 即可

點擊菜單中的 discover 即可查看日誌

三、logback 配置

spring-cloud、logstash 都是支持 logback 的,因此需要爲微服務配置好相應的 logback-spring.xml

這裏值得注意的是,在 spring-boot 中,logback-spring.xml 的加載在 application.yml 之前。而我們需要在 logback-spring.xml 中使用spring.application.name。因此,我們需要把spring.application.name 配置提到 bootstrap.yml 中。

加載順序爲 bootstrap.yml,logback-spring.xml,application.yml

相比普通的 logback-spring.xml,我們主要配置這幾樣東西spring.application.name,logstash 的 appender

這裏提供一個 logback-spring.xml 的例子

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="10 seconds">
              
    <springProperty scope="context"  
        source="spring.application.name" />          
              
    <property 
              value="%date [%thread] %-5level %logger{36} - %msg%n" />                
                    
    <appender >
     <withJansi>true</withJansi>
  <encoder>
           <pattern>${CONSOLE_LOG_PATTERN}</pattern>
     <charset>utf8</charset>
     </encoder>
    </appender>      
    
    <appender 
     class="net.logstash.logback.appender.LogstashTcpSocketAppender">
     <destination>192.168.160.66:4560</destination> 
     <encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
      <providers>
       <timestamp>
        <timeZone>UTC</timeZone>
       </timestamp>
       <pattern>
        <pattern>
         {
           "severity":"%level",
           "service""${springAppName:-}",  
                          "trace""%X{X-B3-TraceId:-}",  
                          "span""%X{X-B3-SpanId:-}",  
                          "exportable""%X{X-Span-Export:-}",  
                          "pid""${PID:-}",  
                          "thread""%thread",  
                          "class""%logger{40}",  
                          "rest""%message"  
         }
        </pattern>
       </pattern>
      </providers>
     </encoder>
    </appender>
    
    <appender >
   <File>main.log</File>
   <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
     <FileNamePattern>main.%d{yyyy-MM-dd}.log</FileNamePattern>
     <maxHistory>30</maxHistory>         
   </rollingPolicy>
   <encoder>
     <Pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{35} - %msg %n</Pattern>
   </encoder>        
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
     <level>DEBUG</level>
   </filter>
 </appender>
          
    <springProfile name="!production"> 
        <logger  />
        <logger />
        <root level="info">  
         <appender-ref ref="stdout" />  
         <appender-ref ref="dailyRollingFileAppender" />  
         <appender-ref ref="logstash" /> 
     </root> 
    </springProfile>
    
    <springProfile > 
  <logger  />
        <logger />
        <root level="info">  
         <appender-ref ref="stdout" />  
         <appender-ref ref="dailyRollingFileAppender" /> 
         <appender-ref ref="logstash" />  
     </root> 
 </springProfile>
</configuration>

我們把 message 信息配置到了 rest 字段中。

三、查詢日誌

啓動服務註冊中心,網關,需要的微服務,以及 sleuth。

啓動 elasticsearch,head,kibana,logstash,隨便運行一個服務,比如

這裏會輸出一行日誌,內容爲myService-provider userController,通過網關調用

eclipse 控制檯輸出日誌

在 kibana 中搜索日誌

我們看到日誌信息在 rest 字段中。另外,通過 trace 和 span 還可以跟蹤到整個微服務的調用過程。到此爲止,整個日誌採集就搭建完成了。系統上線後只需要在 elasticsearch 中就能搜索到各個服務器上,各個微服務的日誌內容了。


作者:guduyishuai

來源:blog.csdn.net/guduyishuai/article/details/79228306

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/l-1txLz_PgyTc155EptM8w