DEBUG和INFO的使用

摘要:
Tomcat下的log日志级别1.等级:DEBUG˂INFO˂WARN˂ERROR˂FATAL;2.区别:2.1DEBUG,主要用于在调试时更详细的了解系统运行状态2.2INFO,重要的输出信息,用来反馈系统的当前状态给最终用户的;**WARN,ERROR,FATAL,分别是警告、错误、严重错误,这三者是系统运行时检测到了一个不正常的状态。

Tomcat下的log日志级别

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 明确错误现象 -> 错误关键描述 -> 最终的错误原因。

免责声明:文章转载自《DEBUG和INFO的使用》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇.Net WebAPI 访问其他项目层操作(转)SQLServer_十步优化SQL Server中的数据访问 三下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

POI设置边框

对单元格设置边框时,有上下左右位置之分,所以POI也准备了四个不同的方法。值说明BORDER_DASH_DOTdash-dotborderBORDER_DASH_DOT_DOTdash-dot-dotborderBORDER_DASHEDdashborderBORDER_DOTTEDdotborderhair-lineborderBORDER_DOUBLEd...

java环境安装Firefox驱动/IE驱动

如果selenium版本是3.x的,需要使用驱动包解决办法:往项目中添加火狐驱动包,并加载驱动的配置。...

tabsSwiper 全屏选项卡(uniapp-uView)

完整代码˂swiper:current="swiperCurrent"@transitio...

mysql修改字段防止锁表

步骤1:修改大表、addcolumn或dropcolumn的字段,操作完成后将锁定该表。此时,查询ok、insert和update将等待锁定。...

Innodb_large_prefix

但是,索引列的总长度不能超过3072字节的限制仍然存在...

scan chain的原理和实现——5.UDTP

UDTP(用户定义的测试点)指示DFTC在设计中用户指定的位置插入控制点和观察点。1.为什么使用UDTP?修复不可控的时钟和/或异步输入;增加设计的测试覆盖率;减少模式数量2.UDTP类型① 力0、力1、力01、力z0、力z1、力z01②控制_ 0...