gpt4 book ai didi

java - 如何正确处理错误日志?

转载 作者:行者123 更新时间:2023-11-29 09:58:29 25 4
gpt4 key购买 nike

在发布这个问题之前,我试着做了几次搜索。如果这是重复的,请告诉我,我会删除它。

我的问题围绕着处理通过我们的网络应用程序产生的错误的正确方法。我们目前通过 log4j 记录所有内容。如果发生错误,它只会在屏幕上显示“发生错误。已通知 IT 部门并将尽快纠正此错误”。这不会告诉用户任何信息……但是当我们尝试重现错误时,它也不会告诉开发人员任何信息。我们必须转到错误日志文件夹并尝试查找此错误。我还要提一下,该文件夹中充满了过去一周的日志。每次出现错误时,都会为该用户创建一个日志文件,并将电子邮件发送给指定处理错误的 IT 人员。此电子邮件未提及日志文件名,但它是日志文件中写入的相同错误文本的副本。

因此,如果 Alicia 在 7:15 遇到问题,但同一分钟发生了 10 个其他错误,我必须遍历每个日志文件以找到她的错误。

我向我的同事提议的是在数据库中添加一个错误日志表。这将为每个错误在表中写入一条记录,记录它是针对谁的,错误,它发生在哪个页面等。这样做的好处是我们可以从表中返回主键值(error_log_id)和在页面上显示一条消息,如“错误引用 ID (1337) 已被记录并已通知适当的 IT 人员。请将此引用 ID 放在手边以备将来使用”。当我们收到邮件时,它会告诉我们错误的 id 以供快速引用。或者,如果用户坚持不懈,他们可以通过 ID 联系我们,我们可以很快找到错误。

您如何设置错误记录?顺便说一下,我们的系统使用连接到 SQL Server 数据库的 Java Servlet。

最佳答案

我回答过类似的问题here ,但我会根据您的问题调整该答案。

我们为此目的使用 requestID - 在处理的最开始(在过滤器中)为每个传入 (HTTP) 请求分配一个请求 ID,然后将其记录在每个日志行中,这样您稍后可以通过该 ID 轻松地 grep 这些日志并找到所有相关行。

如果您认为将 ID 添加到每个日志语句非常乏味,那么您并不孤单 - Java 日志框架通过使用 Mapped Diagnostic Context 使其变得透明(MDC)(至少 log4j 和 logback 有这个)。

RequestID 也可以作为一个方便的引用号,在出现错误时吐出(正如您已经建议的那样)。然而,正如其他人所评论的那样,将这些细节加载到数据库中是不明智的——最好使用文件系统。或者,最简单的方法是只使用 requestID - 然后在发生错误时您不需要做任何特殊的事情。它只是帮助您找到正确的日志文件并在该文件中搜索。

一个requestID会是什么样子?

我们使用以下模式:

<instanceName>:<currentTimeInMillis>.<counter>

In 由以下变量组成:

  • instanceName 在特定部署环境/中唯一标识特定 JVM。
  • currentTimeInMillis 是不言自明的。我们选择以人类可读的格式“yyyyMMddHHmmssSSS”表示它,因此很容易从中读取请求开始时间(注意:SimpleDateFormat 不是线程安全的,因此您需要同步它或在每个请求上创建一个新的).
  • counter 是特定毫秒内的请求计数器 - 在极少数情况下,您可能需要在一毫秒内生成多个请求 ID

如您所见,ID 格式的设置方式保证 currentTimeInMillis.counter 组合在特定 JVM 中是唯一的,并且整个 ID 保证是全局唯一的(好吧,不是真正意义上的“全局”,但它对于我们的目的来说已经足够全局了),而不需要涉及数据库或其他一些中央节点。此外,使用 instanceName 变量可以限制您以后需要查看以查找该请求的日志文件的数量。

然后是最后一个问题:“这在单 JVM 解决方案中很好,但你如何将它扩展到多个 JVM,通过某种网络协议(protocol)进行通信?”

当我们使用 Spring Remoting为了我们的远程处理目的,我们实现了自定义 RemoteInvocationFactory (从上下文中获取请求 ID 并将其保存到 RemoteInvocation attributes )和 RemoteInvocationExecutor (从属性中获取请求 ID,并将其添加到其他 JVM 中的诊断上下文中)。

不确定如何使用纯 RMI 或其他远程方法实现它。

关于java - 如何正确处理错误日志?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/618844/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com