log 的 debug()、 error()、 info()方法的区别
軟件中總免不了要使用諸如 Log4net, Log4j, Tracer 等東東來寫日志,不管用什么,這些東東大多是大同小異的,一般都提供了這樣5個(gè)日志級(jí)別:
??? × Debug
??? × Info
??? × Warn
??? × Error
??? × Fatal
??????? 一個(gè)等級(jí)比一個(gè)高,但是在具體開發(fā)中,關(guān)于應(yīng)該如何選擇適應(yīng)的等級(jí),卻沒有找到好的文章進(jìn)行說明。記錄一下自己的一些看法,以便日后使用吧。
=== Debug ===
??????? 這個(gè)級(jí)別最低的東東,一般的來說,在系統(tǒng)實(shí)際運(yùn)行過程中,一般都是不輸出的。
??????? 因此這個(gè)級(jí)別的信息,可以隨意的使用,任何覺得有利于在調(diào)試時(shí)更詳細(xì)的了解系統(tǒng)運(yùn)行狀態(tài)的東東,比如變量的值等等,都輸出來看看也無妨。
??????? 當(dāng)然,在每一個(gè) Debug 調(diào)用之前,一定要加上 If 判斷。
=== Info ===
??????? 這個(gè)應(yīng)該用來反饋系統(tǒng)的當(dāng)前狀態(tài)給最終用戶的,所以,在這里輸出的信息,應(yīng)該對(duì)最終用戶具有實(shí)際意義,也就是最終用戶要能夠看得明白是什么意思才行。
??????? 從某種角度上說,Info 輸出的信息可以看作是軟件產(chǎn)品的一部分(就像那些交互界面上的文字一樣),所以需要謹(jǐn)慎對(duì)待,不可隨便。
=== Warn、Error、Fatal ===
??????? 警告、錯(cuò)誤、嚴(yán)重錯(cuò)誤,這三者應(yīng)該都在系統(tǒng)運(yùn)行時(shí)檢測(cè)到了一個(gè)不正常的狀態(tài),他們之間的區(qū)別,要區(qū)分還真不是那么簡(jiǎn)單的事情。我大致是這樣區(qū)分的:
??????? 所謂警告,應(yīng)該是這個(gè)時(shí)候進(jìn)行一些修復(fù)性的工作,應(yīng)該還可以把系統(tǒng)恢復(fù)到正常狀態(tài)中來,系統(tǒng)應(yīng)該可以繼續(xù)運(yùn)行下去。
??????? 所謂錯(cuò)誤,就是說可以進(jìn)行一些修復(fù)性的工作,但無法確定系統(tǒng)會(huì)正常的工作下去,系統(tǒng)在以后的某個(gè)階段,很可能會(huì)因?yàn)楫?dāng)前的這個(gè)問題,導(dǎo)致一個(gè)無法修復(fù)的錯(cuò)誤(例如宕機(jī)),但也可能一直工作到停止也不出現(xiàn)嚴(yán)重問題。
??????? 所謂Fatal,那就是相當(dāng)嚴(yán)重的了,可以肯定這種錯(cuò)誤已經(jīng)無法修復(fù),并且如果系統(tǒng)繼續(xù)運(yùn)行下去的話,可以肯定必然會(huì)越來越亂。這時(shí)候采取的最好的措施不是試圖將系統(tǒng)狀態(tài)恢復(fù)到正常,而是盡可能地保留系統(tǒng)有效數(shù)據(jù)并停止運(yùn)行。
??????? 也就是說,選擇 Warn、Error、Fatal 中的具體哪一個(gè),是根據(jù)當(dāng)前的這個(gè)問題對(duì)以后可能產(chǎn)生的影響而定的,如果對(duì)以后基本沒什么影響,則警告之,如果肯定是以后要出嚴(yán)重問題的了,則Fatal之,拿不準(zhǔn)會(huì)怎么樣,則 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.檢查登錄信息對(duì)象: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:代表登錄時(shí)用戶輸入的信息有誤 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("用戶登錄失敗-請(qǐng)求參數(shù)錯(cuò)誤;username=" + login.getLoginNm()); //redirect index.jsp request.getSession().setAttribute(LOGINSTATE, "1"); login.setLoginState("1"); login.setPasswd(""); model.addAttribute("login", login); return INDEX; }//3. 第一登錄失敗,再次登錄需輸入驗(yàn)證碼,判斷驗(yàn)證碼是否正確 if("1".equals(request.getSession().getAttribute(LOGINSTATE))){ if (login.getVerCode() == null || !login.getVerCode().equalsIgnoreCase(VerCodeMaker.verImgGet(session))) { VerCodeMaker.verImgDel(request); log.error("用戶登錄失敗-驗(yàn)證碼檢查失敗;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數(shù)據(jù)錯(cuò)誤;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.獲取用戶認(rèn)證及支付信息 PayAuthInfoDto payInfoDto = payService.getPayAuthInfoByCusCode(dto.getCusCode()); //4. 創(chuàng)建SESSION數(shù)據(jù) User user = new User(); if (null != payInfoDto) { user = UserSession.userSet(dto , payInfoDto); } else { user = UserSession.userSet(dto); } UserSession.setUser(request, user); log.debug("用戶登錄結(jié)束");} 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() 做記錄一般標(biāo)志著方法的開始和結(jié)束。
總結(jié)
以上是生活随笔為你收集整理的log 的 debug()、 error()、 info()方法的区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 两个class写在同一个java文件中
- 下一篇: pip 切换源安装