C# 要从错误中记录多少信息?
在我工作的公司,我创建了一个错误日志类来处理ASP.net应用程序中的错误。这是一个自定义类,因为我们不允许在服务器(nLog、log4net等)上安装其他软件 我目前在我的两个项目中使用它,并从中看到了一些好的结果。现在我正在捕获导致页面和应用程序错误的错误。它发送并存储错误消息和所有内部异常 我现在面临的问题是,我收到的错误我不太确定如何重现。我没有从我的任何用户那里听到任何错误报告。我不知道他们在做什么,甚至不知道他们是否将这些视为错误 我正在考虑在每个页面上创建一个事件日志,或者在我需要更多信息的页面上创建一个事件日志。将其作为会话变量保留在页面上,并向其写入事件(函数的开始/结束、变量更改等)。然后,只有在调用一个错误时,才能将该错误与错误消息一起发送,以查看它是否能更好地描述正在发生的事情。我希望这样做不会在所有用户访问应用程序时给我大量的事件日志,只是希望在一个用户发生错误之前就发生了 你知道我应该用什么方法来防范什么陷阱吗 你对要找的东西有什么建议吗 更新: @萨雷特:我了解你的反应,我同意。我对这家公司相当陌生,仍然需要学习他们如何做事。在过去,我曾与我的同事讨论过拥有这个产品或使用这个开源项目会有多好。问题归根结底是,我们致力于安全系统的工作,而获得批准以获得这些东西需要大量的时间、封面和处理所有的繁文缛节。我将进一步调查这一情况,因为我相信有一个好的错误记录系统是很重要的,目前还没有使用任何东西 @Jim Blizard:我想试着从记录/存储所有东西的地方摆脱出来,然后回来找出对导致错误的情况来说什么是重要的。我不想陷入罗伯托·巴罗斯(Roberto Barros)链接的文章中讨论的信息过载。我目前的想法是,在每个页面的内存中保留一个字符串,如果出现错误,在pages page_error事件中,获取该字符串并将其附加到正在记录的异常。这样,我只记录发生的错误/异常,并存储带有该错误的事件日志。如果什么也没有发生,正在创建的日志将被放入位存储桶中,从此不再显示C# 要从错误中记录多少信息?,c#,asp.net,error-logging,C#,Asp.net,Error Logging,在我工作的公司,我创建了一个错误日志类来处理ASP.net应用程序中的错误。这是一个自定义类,因为我们不允许在服务器(nLog、log4net等)上安装其他软件 我目前在我的两个项目中使用它,并从中看到了一些好的结果。现在我正在捕获导致页面和应用程序错误的错误。它发送并存储错误消息和所有内部异常 我现在面临的问题是,我收到的错误我不太确定如何重现。我没有从我的任何用户那里听到任何错误报告。我不知道他们在做什么,甚至不知道他们是否将这些视为错误 我正在考虑在每个页面上创建一个事件日志,或者在我需要
@罗伯托·巴罗斯:谢谢你的链接,我记得在某处读过,但忘了保存。对于错误,我非常喜欢记录日志。当事情出错时,信息是非常有价值的。我会使用会话标识符将整个日志保存在一个地方(文本文件或数据库表),以便将相关事件分组在一起 这可能不是您想要的确切答案,但既然有功能强大的工具(您提到的工具)为您处理所有这些关键问题,为什么还要开发自己的错误记录机制呢
我很感激您不允许安装其他软件,但日志库不只是像您的自定义代码那样的类吗?根本区别在哪里?我认为花在担心实现日志框架上的时间最好花在宣传和为一个好的日志解决方案做一个商业案例上。我曾经为一家机构工作,该机构不允许安装任何不是我自己的代码或他们(可怕的)COM对象的东西。如果您有这种类型的限制,那么看看是否可以获取log4net的源代码并将其包含在您的项目中
在日志记录方面,目前没有什么比log4net更好的了。以下是我喜欢记录的内容:
- 错误/调试级别(信息、调试、问题、崩溃等)
- 时间
- 描述性文本(通常为一行)
- 堆栈跟踪(如果可能)
- 数据(用户、会话、变量值等)
有趣的故事:有一次,我们有一个错误日志记录到数据库,但我们有坏的数据库凭据,这导致了一个错误,然后被记录。。。最终从递归(IIRC)中得到堆栈溢出。我个人采用以下方法记录asp.net应用程序中的错误(仅记录错误):
- 使用
(我使用受保护的无效应用程序\u错误(对象发送方,事件参数e) { Server.Transfer(“~/Support/ServerErrorSupport.aspx”,true); }
保存所有post数据。)Server.Transfer
- 生成此错误的唯一错误ID(以便可以对同一错误的后续报告进行分组)。ID是从串联字符串计算得出的哈希,该字符串由以下内容组成:文件、方法、lineNr和error.Message。我通过stacktrace上的正则表达式获取文件、方法和lineNr值
- 我将以下所有数据记录到xml结构中(根据数据类型,我以不同的方式存储值,值类型=>ToString(),ISerializable=>serialize,…):
- MachineName:Application.Server.MachineName
- PhysicalRoot:Application.Server.MapPath(“~/”)
- RequestUrl:Application.Request.Url.ToString()
- 应用程序设置:WebConfiguration Manager.AppSettings
- 连接设置:WebConfiguration Manager.ConnectionString
- QueryString:Application.Request.QueryString
- FormPost:Application.Request.Form
- 会话:应用程序会话
- HttpHeaders:Application.Request。