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 之。
示例代碼:
/*** <p>Title: 用戶登錄處理</p>* <p>Description: </p>* @param loginId* @return redirect page*/ @RequestMapping("/user/login.vw") public String login(HttpServletRequest request, HttpServletResponse response, ModelMap model, @ModelAttribute("login") @Validated CusLogin login, BindingResult bindingResult) throws Exception { log.debug("用戶登錄開始......"); //1.檢查登錄信息對象:null判斷 if (null == login) { log.error("用戶登錄失敗-登錄信息不存在"); bindingResult.addError( new FieldError( ErrorMsg.USERNOTEXIST[0], ErrorMsg.USERNOTEXIST[0], ErrorMsg.USERNOTEXIST[1])); request.getSession().setAttribute(LOGINSTATE, "1"); login = new CusLogin(); //1:代表登錄時用戶輸入的信息有誤 login.setLoginState("1"); login.setPasswd(""); model.addAttribute("login", login); return INDEX; } //2字段格式檢查 if (bindingResult.hasErrors()) { List<ObjectError> ers = bindingResult.getAllErrors(); for (ObjectError e : ers) { log.error(e.getDefaultMessage()); } //has error log.error("用戶登錄失敗-請求參數錯誤;username=" + login.getLoginNm()); //redirect index.jsp request.getSession().setAttribute(LOGINSTATE, "1"); login.setLoginState("1"); login.setPasswd(""); model.addAttribute("login", login); return INDEX; }//3. 第一登錄失敗,再次登錄需輸入驗證碼,判斷驗證碼是否正確 if("1".equals(request.getSession().getAttribute(LOGINSTATE))){ if (login.getVerCode() == null || !login.getVerCode().equalsIgnoreCase(VerCodeMaker.verImgGet(session))) { VerCodeMaker.verImgDel(request); log.error("用戶登錄失敗-驗證碼檢查失敗;username=" + login.getLoginNm()); bindingResult.addError( new FieldError( ErrorMsg.VERCODEEROOR[0], ErrorMsg.VERCODEEROOR[0], ErrorMsg.VERCODEEROOR[1])); request.getSession().setAttribute(LOGINSTATE, "1"); login.setLoginState("1"); login.setPasswd(""); model.addAttribute("login", login); return INDEX; } }try { //no error //4.獲取登錄用戶信息:條件為用戶名和用戶類型 LoginUsersDto dto = loginService.login(login); if (null == dto || StringUtility.isEmpty(dto.getLoginName())) { bindingResult.addError( new FieldError( ErrorMsg.USERNOTEXIST[0], ErrorMsg.USERNOTEXIST[0], ErrorMsg.USERNOTEXIST[1])); log.error("用戶登錄-查詢用戶信息失敗,不存在或DB數據錯誤;username=" + login.getLoginNm()); request.getSession().setAttribute(LOGINSTATE, "1"); login.setLoginState("1"); login.setPasswd(""); model.addAttribute("login", login); return INDEX; }//4. 密碼檢查 boolean isPwdExist = loginService.passwordChk( dto.getLoginName(), login.getPasswd(), dto.getPassword()); if (!isPwdExist) { bindingResult.addError( new FieldError( ErrorMsg.PWDERROR[0], ErrorMsg.PWDERROR[0], ErrorMsg.PWDERROR[1])); request.getSession().setAttribute(LOGINSTATE, "1"); login.setLoginState("1"); login.setPasswd(""); model.addAttribute("login", login); log.error("用戶登錄-密碼檢查失敗;username=" + login.getLoginNm()); return INDEX; }//3.獲取用戶認證及支付信息 PayAuthInfoDto payInfoDto = payService.getPayAuthInfoByCusCode(dto.getCusCode()); //4. 創建SESSION數據 User user = new User(); if (null != payInfoDto) { user = UserSession.userSet(dto , payInfoDto); } else { user = UserSession.userSet(dto); } UserSession.setUser(request, user); log.debug("用戶登錄結束");} catch (BizException e) { log.info("用戶登錄失敗;username=" + login.getLoginNm(),e); bindingResult.addError( new FieldError( ErrorMsg.UNKNOWEXPCTION[0], ErrorMsg.UNKNOWEXPCTION[0], ErrorMsg.UNKNOWEXPCTION[1])); login.setPasswd(""); model.addAttribute("login", login); return INDEX; } catch (Exception e) { log.info("用戶登錄失敗,username=" + login.getLoginNm(),e); bindingResult.addError( new FieldError( ErrorMsg.UNKNOWEXPCTION[0], ErrorMsg.UNKNOWEXPCTION[0], ErrorMsg.UNKNOWEXPCTION[1])); login.setPasswd(""); model.addAttribute("login", login); return INDEX; } finally{ request.getSession().removeAttribute(LOGINSTATE); }return REUSERINDEX; }心得:
log.error() 一般是需要if()的;
log.info()一般是在try ?catch 里面
log.debug() 做記錄一般標志著方法的開始和結束。
總結
以上是生活随笔為你收集整理的log 的 debug()、 error()、 info()方法的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 两个class写在同一个java文件中
- 下一篇: pip 切换源安装