技術與架構之springmvc輸入輸出信息打印日誌中

前言

同事在全部controller方法里加入了輸入參數的log輸出,輸出數據的log輸出或者使用aop的方式。真的很煩,鳥菜啊給你們一個簡單的方式。html

先看錯誤的方式

手動添加log打印方式

@Slf4j
@RestController
public class UserController{

	@RequestMapping("getUserInfo")
	public UserInfo getUserInfo(Long userId ){
		log.info("------------->查詢getUserInfo入參{}", id);
		xxxxxxxx
		log.info("------------->查詢getUserInfo輸出{}", xxx);
	}
	@RequestMapping("newGetUserInfo")
	public UserInfo getUserInfo(Long userId , Long appId){
	    log.info("------------->查詢getUserInfo入參id: {} , appId:{}", id, appId);
		xxxxxxxx
		log.info("------------->查詢getUserInfo輸出{}", xxxx);
	}
}
問題
  1. 每一個類都須要加入@Slf4j註解,問題不大。若是不須要打印,那麼能夠不要,要還有一個報警,真煩
  2. 每一個方法聲明下與return以前都要寫輸入輸出的代碼,這個工做量也不小
  3. 多個入參,打印很是麻煩,添加一個入參的時候須要修改,工做量大,容易出錯
  4. 輸入輸出的字符串裏面必須加入方法名,這個工做量也不小。在你複製方法的時候也須要修改,挺煩。添加方法名時容易出錯,修改時忘記修改。容易出錯
  5. 日誌級別不容易控制,必須是info級別,不然會打印不少其餘debug的日誌,由於是info級別,當想關閉輸入輸出的時候,缺由於是還有大量關鍵信息是經過info級別打印到日誌裏面,因此不能關閉。
  6. 若是是使用debug級別打印輸出輸出,當controller的目錄不同時,須要在日誌文件的配置中,controller的日誌級別爲debug。容易忘記配置,出事,線上通常是關閉的。
總結

工做量大,代碼不優雅(難看死了),日誌信息與配置容易出錯,配置很差管理java

aop實現

百度一下隨便找一個spring aop實現日誌輸出的,麻煩你們點擊下Spring AOP實現統一日誌輸出。是在不想萬惡的重複造輪子程序員

問題
  1. 須要基於Spring AOP實現統一日誌輸出,並且很是健壯,沒有問題。並且很是健壯,沒有問題。並且很是健壯,沒有問題。
  2. 須要啓動Spring AOP實現統一日誌輸出
  3. 須要配置aop的切面,若是controller目錄不同,需求添加與修改切面點,容易出錯
  4. 不基於jar依賴的話,須要把Spring AOP實現統一日誌輸出的代碼每一個項目複製一份,超級麻煩,容易出錯。
  5. 當你的Spring AOP實現統一日誌輸出,修改得時候,須要把全部項目jar的依賴修改,若是是複製代碼的方式,那更加麻煩
  6. 若是是jar依賴,須要多一個依賴,做爲管理潔癖者十分很差。若是是經過代碼的方式,可能不須要修改了代碼出問題,項目目錄裏面會出現一個aop目錄,鳥菜啊會煩死去,業務代碼裏面。只有那些業務目錄,不該該出現功能目錄。並且儘可能保證目錄的簡單
總結

管理很是麻煩,容易出錯,須要必定功底的程序員維護,成本大,代價大。web

鳥菜啊的解決方案

第一步引入依賴
<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
		</dependency>
		<dependency>
			<groupId>ch.qos.logback</groupId>
			<artifactId>logback-core</artifactId>
		</dependency>
		<dependency>
			<groupId>ch.qos.logback</groupId>
			<artifactId>logback-access</artifactId>
		</dependency>
		<dependency>
			<groupId>ch.qos.logback</groupId>
			<artifactId>logback-classic</artifactId>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>jcl-over-slf4j</artifactId>
		</dependency>
第二步配置輸入輸出
<logger name="org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod" level="trace" />
第三步看效果
2019-10-21 12:02:18.640 [http-nio-12140-exec-2] TRACEo.s.w.s.m.m.a.ServletInvocableHandlerMethod - Invoking 'com.xxx.UserController.getUserInfo' with arguments [1]

2019-10-21 12:02:18.920 [http-nio-12140-exec-2] TRACEo.s.w.s.m.m.a.ServletInvocableHandlerMethod - Method [com.xxx.UserController.getUserInfo] returned [xxxx]

缺點

  1. 打印的數據有點長
  2. 沒有辦法把多個log輸出合成一個
  3. 要麼一塊兒關閉,一塊兒打開,沒有辦法靈活下

優勢

  1. 優雅
  2. 簡單
  3. 無侵入

侃大山下

  1. 效果怎麼樣,歡迎你們評價下,謝謝
  2. 感受怎麼樣,歡迎你們說說,謝謝
  3. 三個方式的比較怎麼樣,你們說說謝謝
  4. 鳥菜啊,爲何會使用這個方式,你們也能夠說說
相關文章
相關標籤/搜索