DEBUG和INFO的区别 何时用debug何时用info
1. 等级:DEBUG<INFO<WARN<ERROR<FATAL;
2. 区别:
2.1 DEBUG,主要用于在调试时更详细的了解系统运行状态
2.2 INFO,重要的输出信息,用来反馈系统的当前状态给最终用户的;
**WARN,ERROR,FATAL,分别是警告、错误、严重错误,这三者是系统运行时检测到了一个不正常的状态。**
2.3 WARN, 可修复,系统可继续运行下去;
2.4 ERROR, 可修复性,但无法确定系统会正常的工作下去;
2.5 FATAL, 相当严重,可以肯定这种错误已经无法修复,并且如果系统继续运行下去的话后果严重。
3. 使用:
什么时候使用 INFO, WARM, ERROR,FATAL?
3.1 INFO用于打印程序应该出现的正常状态信息, 便于追踪定位;
3.2 WARM表明系统出现轻微的不合理但不影响运行和使用;
3.3 ERROR表明出现了系统错误和异常,无法正常完成目标操作。
3.4 FATAL表明出现了无法修复的错误,并且如果系统继续运行下去的话,必然会越来越乱。
出现FATAL时,采取的最好的措施不是试图将系统状态恢复到正常,而是尽可能地保留系统有效数据并停止运行。
4. 示例:
/** * <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("用户登录开始......"); // 检查登录信息对象: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; } // 字段格式检查 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; } // 第一登录失败,再次登录需输入验证码,判断验证码是否正确 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 // 获取登录用户信息:条件为用户名和用户类型 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; } // 密码检查 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; } // 获取用户认证及支付信息 PayAuthInfoDto payInfoDto = payService.getPayAuthInfoByCusCode(dto.getCusCode()); // 创建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; }
5. 排查步骤:
5.1 打开Tomcat文件中的logs文件夹,然后打开需要查找的文件,debug.log、info.log、error.log等;
5.2 其中,每个日志文件是由时间和大小规则生成的;
5.3 如一个项目的debug.log文件,是2019/7/10 11:48:00创建的,假设14:00,文件装满,比如说40M,那么就会保存为debug.log.1,并再生成一个debug.log文件以此类推;
5.4 debug.log.1文件记录了11:48:00到14:00的日志信息;
5.5 如打开debug.log文件,CTRL+F输入查找目标进行搜索定位;
5.6 明确错误现象 -> 错误关键描述 -> 最终的错误原因。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通