使用ApiBoot Logging進行統一管理請求日誌

ApiBoot Logging經過集成minbox-logging來進行管理每一次請求的日誌信息,包含頭信息參數主體內容路徑、發生的服務器相關信息等,根據接口的響應狀態還能夠記錄響應的頭信息、響應的內容以及發生異常時的堆棧信息java

minbox-projects開源組織

「org.minbox.framework」 致力於向廣大開發者提供一系列的 「開箱即用」 的框架落地實現解決方案。git

自從ApiBoot框架的落地,內部集成的第三方插件(plugin)日漸增多也一樣致使了ApiBoot的源碼太過於冗腫,針對這個問題minbox-projects開源組織就誕生了,ApiBoot第一個加入了該組織,而且會將ApiBoot內集成的第三方插件進行陸續分離,將每個插件做爲獨立的開源項目加入minbox-projects開源組織,方便各個項目的單獨維護以及更新發版。web

組織首頁:gitee.com/minbox-proj…spring

minbox-logging日誌組件

minbox-logging日誌組件是minbox-projects開源組織內的一員,是一款分佈式零侵入式、鏈路式請求日誌分析框架json

提供Admin端點進行採集日誌分析日誌日誌告警通知服務性能分析等。經過Admin Ui可查看實時鏈路日誌信息、在線業務服務列表,致力解決request -> response整個業務請求的日誌分析以及記錄。api

minbox-logging日誌組件源碼:gitee.com/minbox-proj…bash

建立示例項目

經過idea開發工具建立一個SpringBoot項目。服務器

  • pom.xml依賴
<!--配置參數-->
<properties>
  <java.version>1.8</java.version>
  <api.boot.version>2.1.4.RELEASE</api.boot.version>
</properties>

<dependencies>
  <!--Web-->
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
  </dependency>
  <!--ApiBoot Logging-->
  <dependency>
    <groupId>org.minbox.framework</groupId>
    <artifactId>api-boot-starter-logging</artifactId>
  </dependency>
</dependencies>

<dependencyManagement>
  <!--ApiBoot統一版本依賴-->
  <dependencies>
    <dependency>
      <groupId>org.minbox.framework</groupId>
      <artifactId>api-boot-dependencies</artifactId>
      <type>pom</type>
      <scope>import</scope>
      <version>${api.boot.version}</version>
    </dependency>
  </dependencies>
</dependencyManagement>
複製代碼
  • 測試控制器

添加一個用於測試的LoggingSampleController控制器,源碼以下所示:架構

/** * 請求日誌示例 * * @author 恆宇少年 */
@RestController
@RequestMapping(value = "/test")
public class LoggingSampleController {
    /** * 驗證請求參數以及相應內容 * * @param name * @return */
    @GetMapping
    public String hello(@RequestParam("name") String name) {
        return "你好:" + name;
    }

    /** * 驗證主體請求內容以及相應內容 * * @param user * @return */
    @PostMapping
    public String bodyHello(@RequestBody User user) {
        return "你好:" + user.getName();
    }

    /** * RequestBody 示例類 */
    @Data
    public static class User {
        private String name;
    }
}
複製代碼
  • application.yml
spring:
 application:
 name: apiboot-unified-manage-request-logs
server:
 port: 8080
複製代碼

因爲ApiBoot Logging須要記錄日誌產生的服務器相關信息,因此spring.application.name以及server.port這兩個參數必須配置,要否則啓動項目時會拋出錯誤信息。app

  • @EnableLoggingClient註解
@SpringBootApplication
@EnableLoggingClient
public class ApibootUnifiedManageRequestLogsApplication {

    public static void main(String[] args) {
        SpringApplication.run(ApibootUnifiedManageRequestLogsApplication.class, args);
    }

}
複製代碼

使用@EnableLoggingClient註解來開啓日誌的客戶端,將該註解配置在入口類上,內部經過ImportBeanDefinitionRegistrar進行註冊minbox-logging-client所須要的Bean

ApiBoot的版本統一依賴

咱們在使用SpringBoot時發現咱們添加的依賴並不須要指定具體的版本號,這就是版本統一依賴起到的做用,主要仍是Maven繼承關係緣故。

ApiBoot內也存在這麼一個統一維護依賴版本的模塊api-boot-dependencies,這個模塊源碼僅一個pom.xml文件,主要用來配置每個第三方依賴或者內置的依賴的具體版本。

咱們經過在項目中的pom.xml配置文件內添加以下版本管理依賴:

<dependencyManagement>
  <!--ApiBoot統一版本依賴-->
  <dependencies>
    <dependency>
      <groupId>org.minbox.framework</groupId>
      <artifactId>api-boot-dependencies</artifactId>
      <type>pom</type>
      <scope>import</scope>
      <version>${api.boot.version}</version>
    </dependency>
  </dependencies>
</dependencyManagement>
複製代碼

就能夠不指定版本號使用ApiBoot所提供的所有依賴。

測試請求

項目準備完成,咱們先來把項目經過SpringBoot Application方式進行啓動,經過以下curl命令訪問咱們的測試接口:

curl http://localhost:8080/test\?name\=hengboy
複製代碼

訪問完成後,請求成功,可是控制檯並無打印任何請求日誌信息,卻是有一個警告的日誌:

Not set 【LoggingAdminDiscovery】in LoggingFactoryBean,don't invoke report request logs. 複製代碼

這個警告告知的很清楚,咱們並未配置logging-admin,因此沒法執行日誌的上報,咱們本章節是獨立使用ApiBoot Logging日誌組件,因此這個警告信息能夠忽略。

控制檯打印請求日誌

ApiBoot Logging提供了一個配置api.boot.logging.show-console-log,該配置默認值爲false,經過該配置能夠實如今控制檯打印請求日誌。

application.yml配置文件內添加配置以下所示:

api:
 boot:
    # ApiBoot Logging 日誌組件配置
 logging:
 show-console-log: true
複製代碼

添加完成後,重啓項目,再次訪問測試接口,控制檯打印以下所示:

2019-10-16 10:20:18.489  INFO 3930 --- [         task-1] o.m.f.l.c.n.support.LoggingLocalNotice   : Request Uri:/test, Logging:
{"endTime":1571192418416,"httpStatus":200,"requestBody":"","requestHeaders":{"host":"localhost:8080","user-agent":"curl/7.64.1","accept":"*/*"},"requestIp":"0:0:0:0:0:0:0:1","requestMethod":"GET","requestParam":"{\"name\":\"hengboy\"}","requestUri":"/test","responseBody":"你好:hengboy","responseHeaders":{},"serviceId":"apiboot-unified-manage-request-logs","serviceIp":"127.0.0.1","servicePort":"8080","spanId":"35a22772-5015-438a-a441-ba407926b789","startTime":1571192418391,"timeConsuming":25,"traceId":"ec53d162-314e-4516-8c24-5d5e03181543"}
複製代碼

這時咱們就能夠看到打印的請求日誌信息了,不過打印的日誌內容並未進行美化,不要着急,ApiBoot Logging一樣提供了一個配置來進行美化輸出內容。

控制檯美化請求日誌

ApiBoot Logging提供了配置api.boot.logging.format-console-log-json,該參數默認爲false,咱們經過修改該配置的值能夠實現美化打印請求日誌。

application.yml配置文件內添加配置以下所示:

api:
 boot:
    # ApiBoot Logging 日誌組件配置
 logging:
 show-console-log: true
 format-console-log-json: true
複製代碼

添加完成後咱們再次來重啓項目後,訪問測試接口,控制檯打印以下所示:

2019-10-16 10:24:05.480  INFO 4051 --- [         task-1] o.m.f.l.c.n.support.LoggingLocalNotice   : Request Uri:/test, Logging:
{
	"endTime":1571192645404,
	"httpStatus":200,
	"requestBody":"",
	"requestHeaders":{
		"accept":"*/*",
		"host":"localhost:8080",
		"user-agent":"curl/7.64.1"
	},
	"requestIp":"0:0:0:0:0:0:0:1",
	"requestMethod":"GET",
	"requestParam":"{\"name\":\"hengboy\"}",
	"requestUri":"/test",
	"responseBody":"你好:hengboy",
	"responseHeaders":{},
	"serviceId":"apiboot-unified-manage-request-logs",
	"serviceIp":"127.0.0.1",
	"servicePort":"8080",
	"spanId":"277c0973-8042-4740-a8e7-2dbb0c7bb42c",
	"startTime":1571192645381,
	"timeConsuming":23,
	"traceId":"7a742942-f3cc-4d72-9493-d828b090f1cc"
}
複製代碼

這樣是否是很直接明瞭的看到了請求的詳細信息了?不過建議根據本身項目的實際狀況來配置,美化後的日誌會佔用更多的控制檯行

LoggingNotice日誌通知

ApiBoot Logging提供了日誌通知的接口,咱們只須要實現該接口就能夠獲取到每一次請求日誌對象,還能夠自定義每個日誌通知實現類的執行順序

ApiBoot Logging內部提供的實現類以下圖所示:

  • LoggingLocalNotice

    該類就是用於在控制檯打印請求日誌以及美化請求日誌的實現,優先級爲:Ordered#HIGHEST_PRECEDENCE(最高優先級)。

  • LoggingAdminNotice

    該類用於將請求日誌上報到Logging Admin,優先級爲:Ordered#HIGHEST_PRECEDENCE +1,僅低於LoggingLocalNotice

使用LoggingNotice添加Header

在上面咱們已經知道了兩個內置的LoggingNotice實現類,優先級咱們也已經清楚了,那麼咱們若是添加自定義的LoggingNotice實現類來向本次請求日誌的RequestHeader內添加一個咱們自定義的頭信息該怎麼作呢?

AddHeaderLoggingNotice通知類源碼以下所示:

/** * 經過{@link LoggingNotice}向日志的請求header內添加區域信息 * * @author 恆宇少年 */
@Component
public class AddHeaderLoggingNotice implements LoggingNotice {
    /** * 區域頭信息key */
    private static final String SERVER_REGION = "server-region";

    @Override
    public void notice(MinBoxLog minBoxLog) {
        minBoxLog.getRequestHeaders().put(SERVER_REGION, "JiNan");
    }

    /** * 最大優先級 * * @return */
    @Override
    public int getOrder() {
        return HIGHEST_PRECEDENCE;
    }
}
複製代碼

因爲minbox-logging在設計初期就已經考慮到了這一點,因此添加起來比較簡單,咱們只須要調整咱們自定義日誌通知的優先級,而後經過#notice方法修改本次請求日誌對象的值便可。

敲黑板劃重點

本章節咱們介紹了ApiBoot Logging的集成使用,可用於採集請求日誌,能力確不單單如此,使用得當它會很強大,日誌通知設計可使咱們很好的控制一個請求的日誌,對日誌進行添加標識歸類等,能夠經過配置來控制日誌打印以及美化

做者我的 博客 使用開源框架 ApiBoot 助你成爲Api接口服務架構師

相關文章
相關標籤/搜索