ApiBoot Logging
經過集成minbox-logging
來進行管理每一次請求的日誌信息,包含頭信息
、參數
、主體內容
、路徑
、發生的服務器
相關信息等,根據接口的響應狀態還能夠記錄響應的頭信息、響應的內容以及發生異常時的堆棧信息
。java
「org.minbox.framework」
致力於向廣大開發者提供一系列的 「開箱即用」
的框架落地實現解決方案。 git
自從ApiBoot
框架的落地,內部集成的第三方插件(plugin)
日漸增多也一樣致使了ApiBoot
的源碼太過於冗腫,針對這個問題minbox-projects
開源組織就誕生了,ApiBoot
第一個加入了該組織,而且會將ApiBoot
內集成的第三方插件
進行陸續分離,將每個插件做爲獨立的開源項目加入minbox-projects
開源組織,方便各個項目的單獨維護以及更新發版。web
組織首頁:https://gitee.com/minbox-projectsspring
minbox-logging
日誌組件是minbox-projects
開源組織內的一員,是一款分佈式零侵入式、鏈路式請求日誌分析框架。json
提供Admin端點進行採集日誌
、分析日誌
、日誌告警通知
、服務性能分析
等。經過Admin Ui可查看實時鏈路日誌
信息、在線業務服務列表
,致力解決request -> response
整個業務請求的日誌分析以及記錄。api
minbox-logging日誌組件源碼:https://gitee.com/minbox-projects/minbox-loggingbash
經過idea
開發工具建立一個SpringBoot
項目。服務器
<!--配置參數--> <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; } }
spring: application: name: apiboot-unified-manage-request-logs server: port: 8080
因爲ApiBoot Logging
須要記錄日誌產生的服務器相關信息,因此spring.application.name
以及server.port
這兩個參數必須配置,要否則啓動項目時會拋出錯誤信息。app
咱們在使用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" }
這樣是否是很直接明瞭的看到了請求的詳細信息了?不過建議根據本身項目的實際狀況來配置,美化後的日誌會佔用更多的控制檯行。
ApiBoot Logging
提供了日誌通知的接口,咱們只須要實現該接口就能夠獲取到每一次請求
的日誌對象
,還能夠自定義每個日誌通知實現類的執行順序
。
在ApiBoot Logging
內部提供的實現類以下圖所示:
該類就是用於在控制檯打印請求日誌以及美化請求日誌的實現,優先級爲:Ordered#HIGHEST_PRECEDENCE
(最高優先級)。
該類用於將請求日誌上報到Logging Admin
,優先級爲:Ordered#HIGHEST_PRECEDENCE +1
,僅低於LoggingLocalNotice
。
在上面咱們已經知道了兩個內置的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接口服務架構師