今天在我们的应用程序中遇到了令人沮丧的问题,导致ArrayIndexOutOfBounds
异常被抛出。异常的类型只是所记录的所有内容,这是相当无用的(但是,哦,亲爱的遗留应用程序,我们仍然爱你,大多数)。我已经重新部署了应用程序,其中的更改记录了异常处理中的堆栈跟踪(并立即找到了问题的根本原因),并想知道为什么之前没有其他人这样做过。您是否通常记录堆栈跟踪,是否有任何理由不这样做?
如果您可以解释(为什么,而不是如何)在java中跳转箍以获得堆栈跟踪的字符串表示的理由,那么可以获得奖励积分!
答案 0 :(得分:9)
某些日志可能包含敏感数据,日志工具不一定足够安全,无法跟踪生产中的数据。
记录太多会导致信息过多,即系统管理员根本没有信息。如果他们的日志填满了调试消息,他们将无法识别可疑模式。 (多年前我看到一个系统出于安全原因记录所有系统调用。有太多日志,当一些没有特权的用户开始成为root用户时,没有人看到它。)
使用适当的日志级别记录所有内容,并且能够在生产中设置日志级别(至少在Java中不是一个大问题),最好的办法。
答案 1 :(得分:3)
请同时查看这些问题
Logging in Java and in general: Best Practices?
Best practices for Java logging from multiple threads?
需要考虑的重要事项
答案 2 :(得分:2)
我通常会记录堆栈跟踪,因为它有解决/调试问题的信息。这是minidump旁边最好的想法,通常只需通过代码检查和识别问题就可以找到解决方案。
顺便说一句,我同意sibidiba关于你的应用程序内部的潜在信息披露的完整堆栈暴露:函数名称,以及堆栈调用序列,可以告诉受过良好教育的读者。这就是为什么有些产品只在堆栈上记录符号地址,并依赖开发人员从内部pdbs将地址解析为名称的原因。但是我认为将文本记录到包含1行错误和14行堆栈的文件中会使得导航错误日志变得非常困难。它还会导致高可靠性应用程序出现问题,因为日志文件上的锁定时间更长(或者更糟糕的是,日志文件会交错)。我自己多次遇到这些问题,以及支持和排除我自己的应用程序部署的其他问题,这让我实际创建了一个服务,用于在bugcollect.com记录错误。在设计错误收集策略时,我选择每次都收集堆栈转储,并将堆栈用作存储桶密钥的一部分(将同一堆栈中发生的错误分组到同一存储桶中)。
答案 3 :(得分:1)
当开发人员过于自由地记录并且系统管理员发现该应用程序一旦置于生产负载之下,使用巨大的日志文件摧毁并填充HD时,通常会推迟对日志记录的限制。然后很难说服他们你已经看到了你的方式的错误,并且已经充分减少了日志记录(或调整了日志级别),但确实需要剩余的日志条目。
答案 4 :(得分:1)
对我们来说非常简单:如果抛出了意外的异常,我们会记录堆栈跟踪,并尽可能地告诉消息。
我的猜测是,在问题中编写原始代码的开发人员根本没有足够的经验知道只有消息才足够。我也这么想过。
将堆栈跟踪作为字符串进行复杂的原因是因为JRE中没有StringPrintWriter - 我相信他们提供了很多正交构建块,然后根据需要组合它们。你必须自己组装所需的PrintWriter。
答案 5 :(得分:0)
如果你可以解释(为什么, 不是如何)背后的理由 在java中跳转箍以获取字符串 堆栈跟踪的表示!
你不应该只记录throwable而不是通过箍来打印堆栈跟踪吗?像这样:log.error(“部署失败!”,ex)。给定一个throwable,Log4J将打印通过getMessage()获得的错误消息和堆栈跟踪。
答案 6 :(得分:0)
我经常看到的是代码记录这样的异常:
LOG.error(EX);
因为log4j接受一个Object作为第一个参数,它将记录Exception的String表示,它通常只是类的名称。这通常只是对开发人员的疏忽。这样记录和错误会更好:
LOG.error(“foo happen”,ex);
..因此,如果配置正确,日志记录框架将记录堆栈跟踪。