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.nam
e 配置提到 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