ApiBoot Logging
經過集成minbox-logging
來進行管理每一次請求的日誌信息,包含頭信息
、參數
、主體內容
、路徑
、發生的服務器
相關信息等,根據接口的響應狀態還能夠記錄響應的頭信息、響應的內容以及發生異常時的堆棧信息
。java
「org.minbox.framework」
致力於向廣大開發者提供一系列的 「開箱即用」
的框架落地實現解決方案。git
自從ApiBoot
框架的落地,內部集成的第三方插件(plugin)
日漸增多也一樣致使了ApiBoot
的源碼太過於冗腫,針對這個問題minbox-projects
開源組織就誕生了,ApiBoot
第一個加入了該組織,而且會將ApiBoot
內集成的第三方插件
進行陸續分離,將每個插件做爲獨立的開源項目加入minbox-projects
開源組織,方便各個項目的單獨維護以及更新發版。web
組織首頁:gitee.com/minbox-proj…spring
minbox-logging
日誌組件是minbox-projects
開源組織內的一員,是一款分佈式零侵入式、鏈路式請求日誌分析框架。json
提供Admin端點進行採集日誌
、分析日誌
、日誌告警通知
、服務性能分析
等。經過Admin Ui可查看實時鏈路日誌
信息、在線業務服務列表
,致力解決request -> response
整個業務請求的日誌分析以及記錄。api
minbox-logging日誌組件源碼:gitee.com/minbox-proj…bash
經過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
@SpringBootApplication
@EnableLoggingClient
public class ApibootUnifiedManageRequestLogsApplication {
public static void main(String[] args) {
SpringApplication.run(ApibootUnifiedManageRequestLogsApplication.class, args);
}
}
複製代碼
使用@EnableLoggingClient
註解來開啓日誌的客戶端,將該註解配置在入口類上,內部經過ImportBeanDefinitionRegistrar
進行註冊minbox-logging-client
所須要的Bean
。
咱們在使用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
內部提供的實現類以下圖所示:
LoggingLocalNotice
該類就是用於在控制檯打印請求日誌以及美化請求日誌的實現,優先級爲:Ordered#HIGHEST_PRECEDENCE
(最高優先級)。
LoggingAdminNotice
該類用於將請求日誌上報到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
的集成使用,可用於採集請求日誌,能力確不單單如此,使用得當它會很強大,日誌通知設計
可使咱們很好的控制一個請求的日誌,對日誌進行添加標識
、歸類
等,能夠經過配置來控制日誌打印
以及美化
。