網頁

2020/5/28

Log4j2 API參數驗證錯誤輸出的日誌級別 log level for validating input args fail

在Controller接收外部傳入的參數時通常要驗證參數是否合法(例如金額不得小於0、結束日不能超過起始日、字串長度限制等),若驗證失敗時應該用什麼的log level輸出日誌?

看過不少專案光在Controller中使用的level就好幾種,最常見的就是DEBUGERROR,總之就是沒有個標準。

驗證失敗時,不論是以拋出Exception或自組Response的形式回傳,我認為log應該用DEBUG(除錯資訊的日誌)或INFO(一般資訊的日誌)並加上要紀錄的參數資訊。不應該用ERROR(造成應用程式錯誤的日誌)或WARN(可能導致錯誤的日誌),因為驗證失敗不會導致系統錯誤或執行不正常,也沒有進一步導致系統錯誤的可能(當然前提是程式必須是正確的),系統僅是回應外部(例如前端或另一個服務)傳入的參數有問題而已。

log.debug("validation fail, params={}", params);
// or
log.info("validation fail, params={}", params);

不論使用哪種,應該在撰寫規則文件中統一規範使用的level,讓後續的開發者(例如新進人員)有一致的標準可循,而且這份規則文件最好指派某個資深的人員專責維護(沒指派專人的話沒有人會那麼好心花自己的時間去另外整理這些東西)。


此外驗證失敗時以什麼樣的方式將結果回傳出去也常出現沒有標準各自為政的現象。有的人會在Controller捕捉Exception然後回傳response出去,有的人是直接丟Exception出去,有的是用ControllerAdvice@ExceptionHandler統一處理,不過這問題之後有機會在討論。


沒有留言:

張貼留言