由于微服務架構中每個服務可能分散在不同的服務器上,因此需要一套分布式日志的解決方案,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的管理頁面了,
推薦一個 Spring Boot 基礎教程及實戰示例:
https://github.com/javastacks/spring-boot-best-practice
第二步:被管理的微服務端
在我們的其他微服務端需要簡單的配置,納入到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" name="springAppName"
source="spring.application.name" />
<property name="CONSOLE_LOG_PATTERN"
value="https://www.cnblogs.com/javastack/archive/2022/04/21/%date [%thread] %-5level %logger{36} - %msg%n" />
<appender name="stdout" >
<withJansi>true</withJansi>
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
<charset>utf8</charset>
</encoder>
</appender>
<appender name="logstash"
>
<destination>192.168.160.66:4560</destination>
<encoder >
<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 name="dailyRollingFileAppender" >
<File>main.log</File>
<rollingPolicy >
<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 >
<level>DEBUG</level>
</filter>
</appender>
<springProfile name="!production">
<logger name="com.myfee" level="DEBUG" />
<logger name="org.springframework.web" level="INFO"/>
<root level="info">
<appender-ref ref="stdout" />
<appender-ref ref="dailyRollingFileAppender" />
<appender-ref ref="logstash" />
</root>
</springProfile>
<springProfile name="production">
<logger name="com.myfee" level="DEBUG" />
<logger name="org.springframework.web" level="INFO"/>
<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中就能搜索到各個服務器上,各個微服務的日志內容了,
著作權宣告:本文為CSDN博主「guduyishuai」的原創文章,遵循CC 4.0 BY-SA著作權協議,轉載請附上原文出處鏈接及本宣告,
原文鏈接:https://blog.csdn.net/guduyishuai/article/details/79228306
近期熱文推薦:
1.1,000+ 道 Java面試題及答案整理(2022最新版)
2.勁爆!Java 協程要來了,,,
3.Spring Boot 2.x 教程,太全了!
4.別再寫滿屏的爆爆爆炸類了,試試裝飾器模式,這才是優雅的方式!!
5.《Java開發手冊(嵩山版)》最新發布,速速下載!
覺得不錯,別忘了隨手點贊+轉發哦!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/460771.html
標籤:其他
