Spring Cloud 分散式日誌採集方案,建議收藏。。

来源:https://www.cnblogs.com/javastack/archive/2022/04/21/16174152.html
-Advertisement-
Play Games

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


由於微服務架構中每個服務可能分散在不同的伺服器上,因此需要一套分散式日誌的解決方案。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="%date [%thread] %-5level %logger{36} - %msg%n" />

    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
     <withJansi>true</withJansi>
  <encoder>
           <pattern>${CONSOLE_LOG_PATTERN}</pattern>
     <charset>utf8</charset>
     </encoder>
    </appender>

    <appender name="logstash"
     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 name="dailyRollingFileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
   <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 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開發手冊(嵩山版)》最新發佈,速速下載!

覺得不錯,別忘了隨手點贊+轉發哦!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ##urllib的4個模板 1.request:最基本的http請求模塊,用來模擬發送請求,就像是在瀏覽器中輸入一個網址然後回車一樣,只需要傳入uel,timeout等參數就可以實現一個模擬請求。 主要功能:用於模擬發送請求打開和讀取URL。 2.error:異常處理模塊,如果出現請求錯誤,我們可以 ...
  • package com.oop;import java.io.IOException;//Demo1 類public class Demo1 { //main public static void main(String[] args) { } /* 修飾符 返回值類型 方法名(.....) { 方 ...
  • Write less to achieve more. 追求極簡是優秀程式員的特質之一,簡潔的代碼,不僅看起來更專業,可讀性更強,而且減少了出錯的幾率。 本文盤點一些Python中常用的一行(不限於一行)代碼,可直接用在日常編碼實踐中。 歡迎補充交流! 1. If-Else 三元操作符(ternar ...
  • 開頭 看電影還在花錢?啥年代了?居然還有看電影花錢的,今天就給你上一課,讓你看看看電影是不需要花錢的。說乾就乾,衝衝 沖,代碼與實現思路就放在下麵了。 實現目的與思路 目的: 實現對騰訊視頻目標url的解析與下載,由於第三方vip解析,只提供線上觀看,隱藏想實現對目標視頻的下載 思路: 首先拿到想要 ...
  • return語句用於退出函數,向調用方返回一個表達式。 return在不帶參數的情況下(或者沒有寫return語句),預設返回None。 None是一個特殊的值,它的數據類型是NoneType。NoneType是Python的特殊類型,它只有一個取值None。 它不支持任何運算也沒有任何內建方法,和 ...
  • DFA 演算法是通過提前構造出一個 樹狀查找結構,之後根據輸入在該樹狀結構中就可以進行非常高效的查找。 設我們有一個敏感詞庫,詞酷中的辭彙為:我愛你我愛他我愛她我愛你呀我愛他呀我愛她呀我愛她啊 那麼就可以構造出這樣的樹狀結構: 設玩家輸入的字元串為:白菊我愛你呀哈哈哈 我們遍歷玩家輸入的字元串 str ...
  • 前言 又到每日分享Python小技巧的時候了,今天給大家分享啥呢?大家要不要猜一猜,今天給大家分享矢量影像批量裁剪以及合併。 聽起來有點不懂,看完你就懂了,擴展知識。 矢量批量裁剪的代碼 在:chp10\python\矢量批量裁剪.tbx\矢量批量裁剪,可以直接運行,右鍵編輯查看代碼 代碼如下: P ...
  • 目錄 一.簡介 二.效果演示 三.源碼下載 四.猜你喜歡 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 基礎 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 轉場 零基礎 O ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...