log 的 debug()、 error()、 info()方法的區別


軟件中總免不了要使用諸如 Log4net, Log4j, Tracer 等東東來寫日志,不管用什么,這些東東大多是大同小異的,一般都提供了這樣5個日志級別:
    × Debug
    × Info
    × Warn
    × Error
    × Fatal
        一個等級比一個高,但是在具體開發中,關於應該如何選擇適應的等級,卻沒有找到好的文章進行說明。記錄一下自己的一些看法,以便日后使用吧。

=== Debug ===
        這個級別最低的東東,一般的來說,在系統實際運行過程中,一般都是不輸出的。


        因此這個級別的信息,可以隨意的使用,任何覺得有利於在調試時更詳細的了解系統運行狀態的東東,比如變量的值等等,都輸出來看看也無妨。


        當然,在每一個 Debug 調用之前,一定要加上 If 判斷。

=== Info ===
        這個應該用來反饋系統的當前狀態給最終用戶的,所以,在這里輸出的信息,應該對最終用戶具有實際意義,也就是最終用戶要能夠看得明白是什么意思才行。


        從某種角度上說,Info 輸出的信息可以看作是軟件產品的一部分(就像那些交互界面上的文字一樣),所以需要謹慎對待,不可隨便。

=== Warn、Error、Fatal ===
        警告、錯誤、嚴重錯誤,這三者應該都在系統運行時檢測到了一個不正常的狀態,他們之間的區別,要區分還真不是那么簡單的事情。我大致是這樣區分的:


        所謂警告,應該是這個時候進行一些修復性的工作,應該還可以把系統恢復到正常狀態中來,系統應該可以繼續運行下去。


        所謂錯誤,就是說可以進行一些修復性的工作,但無法確定系統會正常的工作下去,系統在以后的某個階段,很可能會因為當前的這個問題,導致一個無法修復的錯誤(例如宕機),但也可能一直工作到停止也不出現嚴重問題。

        所謂Fatal,那就是相當嚴重的了,可以肯定這種錯誤已經無法修復,並且如果系統繼續運行下去的話,可以肯定必然會越來越亂。這時候采取的最好的措施不是試圖將系統狀態恢復到正常,而是盡可能地保留系統有效數據並停止運行。

        也就是說,選擇 Warn、Error、Fatal 中的具體哪一個,是根據當前的這個問題對以后可能產生的影響而定的,如果對以后基本沒什么影響,則警告之,如果肯定是以后要出嚴重問題的了,則Fatal之,拿不准會怎么樣,則 Error 之。

示例代碼:


   
   
  
  
          
  1. /**
  2. * <p>Title: 用戶登錄處理</p>
  3. * <p>Description: </p>
  4. * @param loginId
  5. * @return redirect page
  6. */
  7. @RequestMapping("/user/login.vw")
  8. public String login(HttpServletRequest request, HttpServletResponse response,
  9. ModelMap model, @ModelAttribute("login") @Validated CusLogin login,
  10. BindingResult bindingResult) throws Exception {
  11. log.debug( "用戶登錄開始......");
  12. //1.檢查登錄信息對象:null判斷
  13. if ( null == login) {
  14. log.error( "用戶登錄失敗-登錄信息不存在");
  15. bindingResult.addError(
  16. new FieldError(
  17. ErrorMsg.USERNOTEXIST[ 0],
  18. ErrorMsg.USERNOTEXIST[ 0],
  19. ErrorMsg.USERNOTEXIST[ 1]));
  20. request.getSession().setAttribute(LOGINSTATE, "1");
  21. login = new CusLogin();
  22. //1:代表登錄時用戶輸入的信息有誤
  23. login.setLoginState( "1");
  24. login.setPasswd( "");
  25. model.addAttribute( "login", login);
  26. return INDEX;
  27. }
  28. //2字段格式檢查
  29. if (bindingResult.hasErrors()) {
  30. List<ObjectError> ers = bindingResult.getAllErrors();
  31. for (ObjectError e : ers) {
  32. log.error(e.getDefaultMessage());
  33. }
  34. //has error
  35. log.error( "用戶登錄失敗-請求參數錯誤;username=" + login.getLoginNm());
  36. //redirect index.jsp
  37. request.getSession().setAttribute(LOGINSTATE, "1");
  38. login.setLoginState( "1");
  39. login.setPasswd( "");
  40. model.addAttribute( "login", login);
  41. return INDEX;
  42. }
  43. //3. 第一登錄失敗,再次登錄需輸入驗證碼,判斷驗證碼是否正確
  44. if( "1".equals(request.getSession().getAttribute(LOGINSTATE))){
  45. if (login.getVerCode() == null || !login.getVerCode().equalsIgnoreCase(VerCodeMaker.verImgGet(session))) {
  46. VerCodeMaker.verImgDel(request);
  47. log.error( "用戶登錄失敗-驗證碼檢查失敗;username=" + login.getLoginNm());
  48. bindingResult.addError(
  49. new FieldError(
  50. ErrorMsg.VERCODEEROOR[ 0],
  51. ErrorMsg.VERCODEEROOR[ 0],
  52. ErrorMsg.VERCODEEROOR[ 1]));
  53. request.getSession().setAttribute(LOGINSTATE, "1");
  54. login.setLoginState( "1");
  55. login.setPasswd( "");
  56. model.addAttribute( "login", login);
  57. return INDEX;
  58. }
  59. }
  60. try {
  61. //no error
  62. //4.獲取登錄用戶信息:條件為用戶名和用戶類型
  63. LoginUsersDto dto = loginService.login(login);
  64. if ( null == dto || StringUtility.isEmpty(dto.getLoginName())) {
  65. bindingResult.addError(
  66. new FieldError(
  67. ErrorMsg.USERNOTEXIST[ 0],
  68. ErrorMsg.USERNOTEXIST[ 0],
  69. ErrorMsg.USERNOTEXIST[ 1]));
  70. log.error( "用戶登錄-查詢用戶信息失敗,不存在或DB數據錯誤;username=" + login.getLoginNm());
  71. request.getSession().setAttribute(LOGINSTATE, "1");
  72. login.setLoginState( "1");
  73. login.setPasswd( "");
  74. model.addAttribute( "login", login);
  75. return INDEX;
  76. }
  77. //4. 密碼檢查
  78. boolean isPwdExist = loginService.passwordChk( dto.getLoginName(), login.getPasswd(), dto.getPassword());
  79. if (!isPwdExist) {
  80. bindingResult.addError(
  81. new FieldError(
  82. ErrorMsg.PWDERROR[ 0],
  83. ErrorMsg.PWDERROR[ 0],
  84. ErrorMsg.PWDERROR[ 1]));
  85. request.getSession().setAttribute(LOGINSTATE, "1");
  86. login.setLoginState( "1");
  87. login.setPasswd( "");
  88. model.addAttribute( "login", login);
  89. log.error( "用戶登錄-密碼檢查失敗;username=" + login.getLoginNm());
  90. return INDEX;
  91. }
  92. //3.獲取用戶認證及支付信息
  93. PayAuthInfoDto payInfoDto = payService.getPayAuthInfoByCusCode(dto.getCusCode());
  94. //4. 創建SESSION數據
  95. User user = new User();
  96. if ( null != payInfoDto) {
  97. user = UserSession.userSet(dto , payInfoDto);
  98. } else {
  99. user = UserSession.userSet(dto);
  100. }
  101. UserSession.setUser(request, user);
  102. log.debug( "用戶登錄結束");
  103. } catch (BizException e) {
  104. log.info( "用戶登錄失敗;username=" + login.getLoginNm(),e);
  105. bindingResult.addError(
  106. new FieldError(
  107. ErrorMsg.UNKNOWEXPCTION[ 0],
  108. ErrorMsg.UNKNOWEXPCTION[ 0],
  109. ErrorMsg.UNKNOWEXPCTION[ 1]));
  110. login.setPasswd( "");
  111. model.addAttribute( "login", login);
  112. return INDEX;
  113. } catch (Exception e) {
  114. log.info( "用戶登錄失敗,username=" + login.getLoginNm(),e);
  115. bindingResult.addError(
  116. new FieldError(
  117. ErrorMsg.UNKNOWEXPCTION[ 0],
  118. ErrorMsg.UNKNOWEXPCTION[ 0],
  119. ErrorMsg.UNKNOWEXPCTION[ 1]));
  120. login.setPasswd( "");
  121. model.addAttribute( "login", login);
  122. return INDEX;
  123. } finally{
  124. request.getSession().removeAttribute(LOGINSTATE);
  125. }
  126. return REUSERINDEX;
  127. }

心得:

log.error() 一般是需要if()的;

log.info()一般是在try  catch 里面

log.debug() 做記錄一般標志着方法的開始和結束。

原文地址:https://blog.csdn.net/qq_15037231/article/details/79645342


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM