2009-01-04 32 views
3

在我工作的公司,我创建了一个错误记录类来处理我的ASP.net应用程序中的错误。这是一个自定义类,因为我们不允许在我们的服务器上安装额外的软件(nLog,log4net等)。要从错误中记录多少信息?

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

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

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

你知道我应该注意什么缺陷吗?

您有任何建议要寻找的东西吗?

更新:

@Saret:我understnad你在哪里与响应快到了,我同意。我对这家公司相当陌生,仍然需要了解他们如何做事。在过去,我曾与同事谈过如何拥有这款产品,或者使用这个开源项目。问题归结为,我们在安全系统上工作,并获得批准以获得这些东西需要花费大量时间,封顶和处理所有繁文red节。我会进一步研究这种情况,因为我认为有一个好的错误记录系统非常重要,目前没有任何东西正在被使用。

@Jim Blizard:我想尽量避免记录/存储所有的东西回来,找出对导致错误的情况很重要。我不想陷入过度的罗伯托巴罗斯关联的文章中讨论的信息。我目前的思考方法是,在每个页面的内存中保留一个字符串,并且如果出现错误,则在页面Page_Error事件中,抓住该字符串并将其附加到正在记录的异常。这样我只记录发生的错误/异常并将错误存储到事件日志中。如果没有任何事情发生,那么正在创建的日志将被放入位桶中,永远不会再被看到。

@罗伯托巴罗斯:感谢你的链接,我记得在某处读过它,但忘了保存它。

+0

请纠正我,如果我错了,但据我所知,log4net的是一个单一的DLL和不需要安装。 – 2009-01-04 17:29:32

回答

3

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

我可以欣赏你不允许安装额外的软件,但不会记录库只是类像你的自定义代码?根本区别在哪里?我认为花费在实施日志框架上的时间可能会更好地花费在倡导和制定体面的日志记录解决方案的商业案例上。

1

对于错误,我是一个记录很多很大的粉丝。当事情出错时,信息非常有价值。我会将整个日志保存在一个地方(文本文件或数据库表)中,并使用会话标识符将相关事件分组在一起。

2

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

当谈到日志时,没有比log4net更好的了。

1

这里就是我喜欢记录:

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

最简单的方法是写入一个文本文件,但它可以很好地在数据库中。您还可以使用Windows事件日志。有些事情要注意。嗯...你需要定期清理你的日志。有趣的故事:有一次我们有一个记录到数据库的错误记录器,但是我们有错误的数据库凭证导致了一个错误,然后被记录下来......最终从递归(IIRC)中获得了堆栈溢出。

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组成。我通过stacktrace上的正则表达式获取文件,方法和lineNr值。

  • 我记录所有以下数据到一个XML结构(取决于数据类型,我存储该值不同,值类型=>的ToString(),ISerializable的=>序列,...):

    1. 计算机名:Application.Server.MachineName
    2. PhysicalRoot:Application.Server.MapPath( “〜/”)
    3. RequestUrl:Application.Request.Url.ToString()
    4. 的applicationSettings:WebConfigurationManager.AppSettings
    5. ConnectionSettings:WebConfigurationManager.ConnectionStrings
    6. 查询字符串:Application.Request.QueryString
    7. FormPost:Application.Request.Form
    8. 会议:Application.Session
    9. HttpHeaders:Application.Request。集管
  • 保存XML结构为包含错误ID和时间戳的本地文件。 我选择了这种做法,因为:

    • 本地存储它或在生产过程中在数据库中
    • 因为(测试/调试很容易期间)我可以邮寄的关系(XML文件)对自己文件只是一个(转储高清)保存错误报告(如服务器连接,数据库问题等)的创建过程中可能会出错,只要确保您有写权限。
    • 此外,在servererrorsupport.aspx页面上,保存xml文件后,用户可以选择包含额外信息并添加电子邮件地址以更新有关错误的进度。这会附加到xml文档。
    • 我使用一个xslt文件格式错误数据(xml)在一个不错的错误报告。