• 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
  • 相关阅读:
    zookeeper的ACL权限控制
    Zookeeper客户端Curator基本API
    get和post的区别
    Html基本操作实例代码
    poj3322 Bloxorz I
    Delphi 调用SQL Server 2008存储过程
    架构设计师—你在哪层楼?
    LINUX常用命令
    分层自动化测试与传统自动化测试的差别
    商业智能漫谈
  • 原文地址:https://www.cnblogs.com/jpfss/p/11555289.html
Copyright © 2020-2023  润新知