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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/451323.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

存储容量(空间)换算公式(B、KB、MB、GB、TB、PB、EB)

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 <strong>存储容量&#xff1a;是该存储设备上可以存储数据的最大数量&#xff0c;通常使用千字节&#xff08;kb kilobyte&#x…

如何防止表单的重复提交

表单重复提交是在多用户Web应用中最常见、带来很多麻烦的一个问题。有很多的应用场景都会遇到重复提交问题&#xff0c;比如&#xff1a; (1)点击提交按钮两次。 (2)点击刷新按钮。 (3)使用浏览器后退按钮重复之前的操作&#xff0c;导致重复提交表单。 (4)使用浏览器历史记录重…

GDB调试精粹及使用实例

一&#xff1a;列文件清单 1&#xff0e; List (gdb) list line1,line2 二&#xff1a;执行程序 要想运行准备调试的程序&#xff0c;可使用run命令&#xff0c;在它后面可以跟随发给该程序的任何参数&#xff0c;包括标准输入和标准输出说明符(<和>)和外壳通配符&a…

如何使用log.debug()

log4j是一个开源的日志&#xff0c;共分为六个等级&#xff1a;LOG、DEBUG、INFO、WARN、ERROR、和FATAL。 DEBUG是其中的一种日志级别。一般我们用这个方法的时候都是这样的&#xff1a; if(log.isDebugEnabled()){log.debug("debug&#xff01;"); } 意思是&am…

写给大数据开发初学者的话

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 导读&#xff1a; 第一章&#xff1a;初识Hadoop 第二章&#xff1a;更高效的WordCount第三章&#xff1a;把别处的数据搞到Hadoop上第…

2018年7月份,python上传自己的包库到pypi官网的方法

最近pypi官网进行了更新&#xff0c;老的上传网址作废了。记录下上传到pypi的方法 0、去pypi官网注册账号&#xff0c;没账号是不可能上传的&#xff0c;想想也是那不乱套了吗&#xff0c;注册后会收到一个邮件需要点击然后重新登录 1、目录就是这样 &#xff0c;我要上传muli…

linux系统C语言学习总结

引言   尽管 C 语言问世已近 30 年&#xff0c;但它的魅力仍未减退。C 语言继续吸引着众多的开发者&#xff0c;他们为了编写、移植或维护应用程序而必须学习新技能。   本文是为了满足对C语言初学者或想提高自身C语言修为的开发人员的需要而写的。希望对您的学习和工作有…

redis 删除操作

Redis 键(key) Redis 键命令用于管理 redis 的键。 语法 Redis 键命令的基本语法如下&#xff1a; redis 127.0.0.1:6379> COMMAND KEY_NAME 实例 redis 127.0.0.1:6379> SET runoobkey redis OK redis 127.0.0.1:6379> DEL runoobkey (integer) 1 在以上实例中 DEL 是…

写给大数据开发初学者的话2

见 : http://lxw1234.com/archives/2016/11/782.htm 如果你已经按照《写给大数据开发初学者的话》中第一章和第二章的流程认真完整的走了一遍&#xff0c;那么你应该已经具备以下技能和知识点&#xff1a; 0和Hadoop2.0的区别&#xff1b;MapReduce的原理&#xff08;还是那个…

Pandas的结构和应用

Pandas处理以下三个数据结构 - 系列(Series)----一维ndarray   特点&#xff1a;带有标签&#xff0c;可以使用标签作为索引&#xff0c;大小不能改变&#xff0c;内部数据可以改变。 属性&#xff1a;与NumPy类似&#xff0c;多了一个轴标签axis lables 数据…

JZOJ5857 【NOIP提高组模拟A组2018.9.8】没有上司的舞会

题目 Description “那么真的有果尔德施坦因这样一个人?”他问道。 “是啊&#xff0c;有这样一个人&#xff0c;他还活着。至于在哪里&#xff0c;我就不知道了。” “那么那个密谋——那个组织?这是真的吗?不是秘密警察的捏造吧?” “不是&#xff0c;这是真的。我们管…

python 中如何判断list中是否包含某个元素

在python中可以通过in和not in关键字来判读一个list中是否包含一个元素 theList [‘a’,’b’,’c’] if ‘a’ in theList: print ‘a in the list’ if ‘d’ not in theList: print ‘d is not in the list’

时间即财富:创业者浪费精力的八个错误

导读&#xff1a;本文作者Jeff Miller是美食网页应用Punchfork的创始人&#xff0c;同时也是DuckDuckGo、Ginzametrics、Art.sy、DataMinr以及Forkly的投资人。作者通过对自己创业初期一些错误选择进行盘点&#xff0c;告诉读者在创业初期应该学会选择&#xff0c;因为在创业初…

写给大数据开发初学者的话3

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 如果你已经按照《写给大数据开发初学者的话2》中第三章和第四章的流程认真完整的走了一遍&#xff0c;那么你应该已经具备以下技能和知识…

十五周二次课

18.6 负载均衡集群介绍 主流开源软件LVS、keepalived、haproxy、nginx等其中LVS属于4层&#xff08;网络OSI 7层模型&#xff09;&#xff0c;nginx属于7层&#xff0c;haproxy既可以认为是4层&#xff0c;也可以当做7层使用keepalived的负载均衡功能其实就是lvslvs这种4层的负…

LeetCode--171--Excel表列序号

问题描述&#xff1a; 给定一个Excel表格中的列名称&#xff0c;返回其相应的列序号。 例如&#xff0c; A -> 1B -> 2C -> 3...Z -> 26AA -> 27AB -> 28 ...示例 1: 输入: "A" 输出: 1示例 2: 输入: "AB" 输出: 28示例 3: 输入: "…

中国历代王朝大排名

中国自秦以降&#xff0c;一共出过九个大王朝&#xff0c;它们是&#xff1a;秦、汉、晋、隋、唐、宋、元、明、清。另外&#xff0c;还出过五十几个小王朝&#xff0c;它们是&#xff1a; 三国时的魏、蜀、吴&#xff0c;共三个&#xff1b; [ 转自铁血社区 http://bbs.tiexue…

写给大数据开发初学者的话4

见&#xff1a;http://lxw1234.com/archives/2016/11/795.htm 如果你已经按照《写给大数据开发初学者的话3》中第五章和第六章的流程认真完整的走了一遍&#xff0c;那么你应该已经具备以下技能和知识点&#xff1a; 为什么Spark比MapReduce快。使用SparkSQL代替Hive&#xff…

TPS及计算方法

TPS (transaction per second)代表每秒执行的事务数量&#xff0c;可基于测试周期内完成的事务数量计算得出。例如&#xff0c;用户每分钟执行6个事务&#xff0c;TPS为6 / 60s 0.10 TPS。同时我们会知道事务的响应时间(或节拍)&#xff0c;以此例&#xff0c;60秒完成6个事务…

域名解析服务之DNS查询类型

在实际应用中DNS查询主要分为两种方式查询&#xff1a;1.递归查询&#xff1b;2.迭代查询 一般情况下&#xff1a;为了减少资源的消耗&#xff0c;网络中客户端与所属的本地DNS服务器查询方式通常为递归查询&#xff0c;本地DNS服务器与外部的公共DNS服务器间的查询方式为迭代查…