3

在我工作的公司,我创建了一个错误日志类来处理我的 ASP.net 应用程序中的错误。这是一个自定义类,因为我们不允许在我们的服务器上安装其他软件(nLog、log4net 等)。

我目前在我的两个项目中使用它,并从中看到了一些好的结果。现在我正在捕获导致页面和应用程序错误的错误。它发送并存储错误消息和所有内部异常。

我现在遇到的问题是,我收到了我不太确定如何重现的错误。我没有从任何用户那里听到任何错误报告。我不确定他们在做什么,或者即使他们将这些视为错误。

我正在考虑在每个页面上创建一个事件日志,或者在我想要更多信息的页面上创建一个事件日志。将其作为 Session 变量保存在页面上,并向其写入事件(函数的开始/结束、变量更改等)。然后只有当一个错误被调用来让它与错误消息一起发送时,看看它是否能更好地了解正在发生的事情。我希望这样做不会在所有用户访问应用程序时给我大量的事件日志,只是希望在一个用户发生错误之前发生。

你知道我应该注意的任何陷阱吗?

你对要寻找的东西有什么建议吗?

更新:

@Saret:我知道您的回复来自哪里,我同意。我对这家公司还很陌生,仍然需要学习他们是如何做事的。过去,我曾与我的同事进行过对话,如果拥有这个产品或使用这个开源项目会很棒。问题归结为,我们致力于安全系统,并且获得批准以获取这些东西需要花费大量时间、顶盖和处理所有繁文缛节。我会进一步调查这种情况,因为我相信拥有一个好的错误记录系统很重要,目前没有使用任何东西。

@Jim Blizard:我想尝试避免在某个地方记录/存储所有内容,然后找出对导致错误的情况很重要的内容。我不想陷入罗伯托·巴罗斯(Roberto Barros)链接的文章中谈论的过多信息。我目前的想法是,在每个页面的内存中保留一个字符串,如果出现错误,则在页面 Page_Error 事件中,获取该字符串并将其附加到正在记录的异常中。这样我只记录发生的错误/异常并存储带有该错误的事件日志。如果没有任何反应,正在创建的日志将被丢弃到比特桶中,再也不会被看到。

@Roberto Barros:感谢那个链接,我记得在某处读过它,但忘记保存了。

4

5 回答 5

3

这可能不是您正在寻找的确切答案,但是当有强大的工具(您提到的)可以为您处理所有这些关键问题时,为什么要开发自己的错误记录机制呢?

我很感激您不允许安装其他软件,但不记录库只是像您的自定义代码这样的类?根本区别在哪里?我认为花时间担心实现日志框架可能会更好地用于倡导和为一个体面的日志解决方案制定商业案例。

于 2009-01-04T17:52:09.060 回答
2

我曾经在一家不允许安装任何不是我自己的代码或他们(可怕的)COM 对象的机构工作。如果您有这种类型的限制,那么看看您是否可以获取 log4net 的源代码并将其包含在您的项目中。

在日志记录方面,目前没有什么比 log4net 更好的了。

于 2009-01-04T17:57:22.327 回答
2

我个人在 asp.net 应用程序中记录错误(并且仅记录错误)时采用了以下方法:

  • 使用 protected void Application_Error(object sender, EventArgs e) { Server.Transfer("~/Support/ServerErrorSupport.aspx", true); } (我会Server.Transfer保留所有帖子数据。)

  • 生成此错误唯一的错误 ID(因此可以对同一错误的后续报告进行分组)。ID 是由连接字符串计算得出的哈希值,该字符串包括:file、method、lineNr 和 error.Message。我通过堆栈跟踪上的正则表达式获取文件、方法和 lineNr 值。

  • 我将以下所有数据记录到 xml 结构中(根据数据类型,我以不同的方式存储值,值类型 => ToString()、ISerializable => 序列化,...):

    1. 机器名:Application.Server.MachineName
    2. PhysicalRoot: Application.Server.MapPath("~/")
    3. RequestUrl:Application.Request.Url.ToString()
    4. 应用程序设置:WebConfigurationManager.AppSettings
    5. 连接设置:WebConfigurationManager.ConnectionStrings
    6. 查询字符串:Application.Request.QueryString
    7. FormPost:Application.Request.Form
    8. 会话:Application.Session
    9. HttpHeaders:Application.Request.Headers
  • 将 xml 结构保存为包含错误 ID 和时间戳的本地文件。我选择这种方法是因为:

    • 我可以将 rapport(xml 文件)邮寄给自己(在测试/调试期间非常容易)
    • 在生产期间将其存储在本地或数据库中
    • 因为该文件只是一个(转储到高清)保存,所以在创建错误报告期间不会出错(如服务器连接、数据库问题等),只需确保您具有写入权限即可。
    • 此外,在 servererrorsupport.aspx 页面上,保存 xml 文件后,用户可以选择包含额外信息并添加电子邮件地址,以随时了解有关错误的进度。这将附加到 xml 文档中。
    • 我使用 xslt 文件在一个不错的错误报告中格式化错误数据 (xml)。
于 2009-01-05T01:36:17.827 回答
1

对于错误,我非常喜欢记录 A LOT。当出现问题时,信息非常有价值。我会将整个日志与会话标识符一起保存在一个地方(文本文件或数据库表),以将相关事件组合在一起。

于 2009-01-04T17:24:56.383 回答
1

这是我喜欢记录的内容:

  • 错误/调试级别(信息、调试、问题、崩溃等)
  • 时间
  • 描述性文本(通常是一行)
  • 堆栈跟踪(如果可能)
  • 数据(用户、会话、变量值等...)

最简单的方法是写入文本文件,但最好将其保存在数据库中。您还可以使用 Windows 事件日志。有些事情要注意。嗯...您需要定期清除日志。

有趣的故事:有一次我们有一个错误记录器记录到数据库,但是我们有错误的数据库凭据导致了一个错误,然后被记录了......最终从递归(IIRC)中得到堆栈溢出。

于 2009-01-04T18:02:58.180 回答