记录异常日志的7条规则

最近一直在帮忙调试一些让人头大的bug问题,这才意识到如何记录异常日志对于简化调试的重要性,我总结了几点记录异常日志的最佳实践发表在此。

1、记录技术性异常而不是用户异常

用户异常(如:“登录用户名已经存在”)除了显示给用户,要么什么都别管,要么根本就不是异常(“用户尚未认证”)。技术性异常(如:“文件存储不够,没法订阅此产品”)才是你需要调试而为此做出反应的,如果你记录所有事情很有可能因日志实体太长而不能真正有意义的反映到你所记录异常日志中。你应该查明日志文件中的每个异常找到其原因(“是bug吗”),过多的异常将使你草率地对待异常(“额,仅仅是一个普通异常”)。

2、把数据存储在异常中以便更易于记录

“没法收取账户费用“这样的异常你应该存储异常的上下文,就像Junit所做的(“期望…但是得到…”)以便更易于调试。

CannotChargeMoneyAccountExceptionMoney(moneyInAccount, Money toCharge, Account account)这段子句可以理解为:“尝试收取账户1234567890 20EUR,但是只有10EUR可用”相对于“扣除失败”,这使得在之后有意义的方式记录异常变得更简单。

3、记录异常的描述信息

糟糕的例子来自于Sun:ClassCastException不能显示什么类你想要转换。 现在甚至可以发现:

final String s = "Hello";
final int x = (Integer) s;

在编译时就告诉你:

 T.java:4: inconvertible types
 found   : java.lang.String
 required: java.lang.Integer
          final Integer x = (Integer) s;

在运行期间Java抛出的异常

  Exception in thread "main" java.lang.ClassCastException:
  java.lang.String cannot be cast to java.lang.Integer

这样显得比前者要好

4、输出导致异常的原因

如果在异常中有一个包装的方式作为异常的起因,那么记录所有的原因。一些日志框架已经帮你这样做了,有些还没有,因此要确保异常的所有原因记录在日志文件中,保证所有相关的堆栈追踪信息的开始处记录在你的文件中,而不是杂乱无章的。

5、选择合理的日志级别

如果你的异常危急的,记录它为Level.CRITICAL,如果你需要确定危急对你来说意味着什么(通常意味着金钱损失),例如如果一个预定功能失效,或者由于技术问题用户不能注册,然后你就有一个危急问题需要解决。 监控日志文件中危急的异常,因为你正在蒙受着损失。拥有你自己的异常实现isCritical()或者CRITICALException接口,用封装类以及正确的日志级别记录异常到文件中。如果你的日志框架找不到合理的级别,那么创建它。

6、不要记录后又重新向外抛出

记录日志后重新抛出异常是一个异常反模式(anti-pattern)。

catch (NoUserException e) {
       LOG.error("No user available", e);
       throw new UserServiceException("Nouseravailable", e);
}

不要这么做,你的日志文件包含相同的异常好几次在堆栈级别上,记住仅仅记录一次。

7、不要使用System.out或者System.err记录

使用日志框架,它可以比你处理得更好

希望这些规则在处理异常日志时能帮助到你,能使你更容易调试。

英文原文:Codemonkeyism,编译:ImportNew - 刘志军
译文链接: http://www.importnew.com/518.html

原文地址:https://www.cnblogs.com/yuyu666/p/9842800.html

时间: 2024-08-28 20:39:53

记录异常日志的7条规则的相关文章

在 C# 控制台中记录异常日志并输出

最近做了一个小程序,要求在控制台中记录程序运行的异常并输出到指定的文件夹中,以下是我的具体的程序代码: public static void ErrorLog(Exception ex) { string FilePath = "/ErrorLog.txt"; StringBuilder msg = new StringBuilder (); msg.Append("*************************************** \n"); msg.

ASP.NET全局错误处理和异常日志记录以及IIS配置自定义错误页面

应用场景和使用目的 很多时候,我们在访问页面的时候,由于程序异常.系统崩溃会导致出现黄页.在通常的情况下,黄页对于我们来说,帮助是极大的,因为它可以帮助我们知道问题根源,甚至是哪一行代码出现了错误.但这对于用户是非常可怕的,因为用户不知道发生了什么,也无法了解黄页给出的内容.甚至,如果我们遇到一些不友好的人,他们会拿这些内容大做文章,对我们网站产生威胁. 那我们如何在程序异常.系统崩溃时,不会出现黄页,并且还可以给出一些更加友好的提示呢?甚至在我们需要的时候,可以收集这些异常信息,并加以分析,能

Spring + Aop+注解 集成使用 Log4j,实现异常日志记录

A,首先说,如何配置: 1,在web.xml中添加代码: <!-- log4j的配置相关 --> <context-param> <param-name>log4jConfigLocation</param-name> <param-value>classpath:config/log4j/log4j.properties</param-value> </context-param> <context-param&g

中间件怎样记录SQL日志

中间件调试的时候,往往需要记录所执行SQL的日志,便于排除程序的BUG. 其实,有一种最简单的办法来实现. 像FIREDAC.UNIDAC还有ADO等数据库引擎,本身提供了SQL日志记录功能. 在程序里面直接开启它们的日志记录功能即可.既方便又省事. 另外,这些数据库引擎,还提供了记录异常日志的功能. 原文地址:https://www.cnblogs.com/hnxxcxg/p/12336314.html

Java日志记录的5条规则

日志记录是在软件开发过程中常常需要考虑的关键因素. 当产品运行出错时,日志文件通常是我们进行错误分析的首要选择. 而且,在很多情况下,它们是我们手上唯一可以用来查明发生状况和问题根本原因的信息. 可见,正确记录需要的信息是极其重要的. 以下5条日志规则,让我们可以检查和改进在代码中操作日志记录的方式. 同时也请注意,我们既不会讨论怎么配置一个日志引擎,也不会相互比较. 规则1.日志是面向读者的 日志消息不仅要对书写(日志)代码的人有意义,也应该对日志文件的读者有意义. 这似乎是一条很明显但却经常

OneAPM大讲堂 | Java 异常日志记录最佳实践

[编者按]本文作者是 Casey Dunham.Casey 是一位具有 10 多年经验的专业软件开发人员,以其独特的方式应对应用安全问题而闻名.本文系国内 ITOM 管理平台 OneAPM 工程师编译整理. 作为安全顾问,我对各种应用程序进行评估. 在我测试过的所有应用程序中,我发现它们通常会遇到一些对异常问题的处理和日志记录不足.日志记录和监控往往是被忽视的领域,并且由于对 Web 应用程序的威胁日益增加,它们已被添加到 OWASP Top 10 的十大问题之一,名为"Insufficient

从壹开始前后端分离 [.netCore 不定期更新 ] 三十五║ 完美实现全局异常日志记录

缘起 哈喽我是不定期更新的日常,昨天群里小伙伴问到了记录日志,当然,以前我也挖过这个坑,后来一直没有来得及填上,也想着 swagger 一直又有错误信息展示的功能,就迟迟没有添加这个功能,不过昨天夜里想了想,还是需要增加上,旨在提高框架的高效性.不定期日常就直接上代码了,我有一个小想法,就是希望大家有好的想法,可以给我说,我会整理下,添加到框架里,并在文章头里写上 投稿作者:这里重点说明下,是参考群里小伙伴 Hello World! 的相关内容,并在他的基础上更新,添加了注入和全局,大家可以看看

SpringBoot使用AOP记录请求日志和异常日志

本文基础WEB环境使用SpringBoot及Spring-Data-Jpa构建 关于SpringBoot及JPA用法本文不再过多讨论,下面是引入的jar: 起步依赖 web及aop依赖 jpa依赖 mysql驱动 本文着重AOP的使用,你也可以使用自己构建的环境 由于本文中使用的JPA,因此首先创建保存日志及保存异常的实体类,如果你使用的是Mybatis,则需要首先创建表然后根据表来逆向生成实体类 保存日志的实体类: 日志实体 保存异常的实体类: 异常实体 接下来我们定义一个Operation注

Atitit mysql 存储过程捕获所有异常,以及日志记录异常信息

1.1. 异常的处理模式exit  continue undo模式 1 1.2. 捕获所有异常使用        DECLARE continue HANDLER FOR   sqlexception 1 1.3. 捕获特定异常使用HANDLER FOR  errorcode 2 1.4. 记录异常到日志表,获取异常代码和异常信息 2 1.5. 抛出自定义异常 3 2. 程序语言中捕获sql自定义抛出的异常 3 2.1. 代码 3 3. 集合的循环loop while repeat模式 4 3.