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() 做记录一般标志着方法的开始和结束。

  • 10
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: log.debuginfoerror是日志级别,用于指定日志的重要程度和记录的详细程度。 log.debug表示调试级别,用于记录程序的调试信息,通常在开发和测试阶段使用。 log.info表示信息级别,用于记录程序的运行信息,通常用于生产环境中,可以帮助开发人员快速定位问题。 log.error表示错误级别,用于记录程序的错误信息,通常用于生产环境中,可以帮助开发人员快速定位并解决问题。 ### 回答2: 在软件开发中,日志是非常重要的工具,可以记录程序运行时发生的事件、错误和用户操作等信息,帮助开发人员追踪问题和改进软件质量。常见的几个日志级别包括log.debuginfoerror。 首先,log.debug级别一般用于开发过程中,用于输出一些调试信息,比如变量的值、函数的参数等。这些信息在正式上线后通常不会输出到日志中,但在开发过程中可以帮助开发人员调试程序。如果在生产环境中启用了debug输出,那么可能会带来不必要的性能开销,因此在生产环境中一般会关闭debug输出。 其次,info级别用于输出一些关键事件或者重要信息。这些信息不像debug级别的调试信息那样频繁出现,通常是在程序运行中产生的一些关键事件。比如用户登录、请求处理完成、系统启动等。在生产环境中,info级别的日志一般会保留,帮助监控程序运行情况和定位问题。 最后,error级别用于输出程序中的错误和异常信息。这些信息通常是程序运行中不可避免的产生的,例如发生了未经处理的异常或者数据库访问失败等。error级别的日志是非常重要的,可以帮助开发人员快速定位并修复错误,在生产环境中也会被保留下来以便进行故障排查。 总之,不同级别的日志在软件开发中都有其作用,合理使用可以帮助开发人员更好地理解程序运行情况并修复问题。同时,在生产环境中管理好日志输出也是关键之一,要注意平衡日志量和性能以及数据保留周期等方面的问题。 ### 回答3: log.debuginfoerror是指一种日志级别,用于在软件开发中记录系统或应用程序的运行信息。在开发过程中,开发人员需要使用日志来记录或跟踪系统过程,以便快速诊断或解决问题,log.debuginfoerror就是在这个过程中使用的不同级别的日志。 log.debug是指记录调试信息的日志级别,主要用于在代码开发和调试过程中输出一些详细的调试信息,方便开发人员更好地了解系统或应用程序工作的情况和可能存在的问题。通常只有在软件测试或调试阶段才需要使用debug级别的日志。 info是指记录一般信息的日志级别,它通常用来记录系统或应用程序的一些正常运行信息,如业务逻辑的处理流程、重要操作的结果、用户操作的反馈等。info级别的日志信息对于开发人员和用户来说都是非常有用的,可以帮助他们了解系统或应用程序的运行情况和处理结果。 error是指记录错误信息的日志级别,它用于记录系统或应用程序出现的异常、错误、警告等情况,帮助开发人员快速定位和排除问题。error级别的日志信息对于开发人员来说是非常重要的,它可以帮助开发人员及时发现并解决问题,提升系统稳定性和可靠性。 总的来说,在软件开发中使用日志是非常必要的,而log.debuginfoerror则是常用的日志级别,它们分别用于记录不同类型的信息,方便开发人员进行系统调试和问题定位。开发人员需要根据实际需求灵活运用不同级别的日志,以提高效率和提升系统质量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值