【问题标题】:Error logging in C#在 C# 中记录错误
【发布时间】:2010-09-13 22:29:09
【问题描述】:

我正在从 C++ 编码切换到 C#。我需要用 C# 中类似的东西替换我的 C++ 错误记录/报告宏系统。

在我的 C++ 源代码中我可以编写

LOGERR("一些错误"); 要么 LOGERR("输入 %s 和 %d 出错", stringvar, intvar);

然后,宏和支持库代码将(可能是可变参数)格式化的消息连同源文件、源代码行、用户名和时间一起传递到数据库中。相同的数据也被填充到数据结构中,以便以后向用户报告。

是否有人有 C# 代码 sn-ps 或指向执行此基本错误报告/记录的示例的指针?

编辑:在我问这个问题的时候,我对 .NET 真的很陌生,并且不知道 System.Diagnostics.Trace。 System.Diagnostics.Trace 是我当时所需要的。从那以后,我在日志记录要求更大、更复杂的项目中使用了 log4net。只需编辑那个 500 行的 XML 配置文件,log4net 就会做你需要的一切:)

【问题讨论】:

    标签: c# error-reporting error-logging


    【解决方案1】:

    我强烈建议您查看log4Net。这个post 涵盖了您入门所需的大部分内容。

    【讨论】:

    • “在每个类的开头声明一个记录器实例,如下所示......” 你把我弄丢了。 :-)
    【解决方案2】:

    ExceptionLess 是可用于记录的最简单的 nuget 包之一。它是一个open source 项目。它会自动处理未处理的异常,并提供manually logs 的选项。您可以在线登录或在本地服务器上self host

    【讨论】:

    • 我从事 Exceptionless 项目,非常乐意回答任何问题。我们为所有主要的日志框架都有日志目标,因此您可以通过使用 Exceptionless(免费日志消息 + 未处理的异常)立即获得很多价值
    【解决方案3】:

    Serilog 在这里聚会迟到了,但带来了一些有趣的选择。它看起来很像经典的基于文本的记录器:

    Log.Information("Hello, {0}", username);
    

    但是,与早期的框架不同,它仅在编写文本时将消息和参数呈现为字符串,例如到文件或控制台。

    这个想法是,如果您使用“NoSQL”风格的数据存储来存储日志,您可以记录如下事件:

    {
        Timestamp: "2014-02-....",
        Message: "Hello, nblumhardt",
        Properties:
        {
            "0": "nblumhardt"
        }
    }
    

    扩展了 .NET 格式字符串语法,因此您可以将上面的示例编写为:

    Log.Information("Hello, {Name}", username);
    

    在这种情况下,该属性将被称为Name(而不是0),从而使查询和关联更容易。

    已经有一些不错的存储选择。 MongoDB 和 Azure Table Storage 似乎很受 DIY 的欢迎。我最初构建了 Serilog(尽管它是一个社区项目),现在我正在开发一个名为 Seq 的产品,它提供对此类结构化日志事件的存储和查询。

    【讨论】:

      【解决方案4】:

      这里有很多 log4net 拥护者,所以我相信这会被忽略,但我会添加我自己的偏好:

      System.Diagnostics.Trace
      

      这包括侦听您的Trace() 方法,然后写入日志文件/输出窗口/事件日志的侦听器,包括在框架中的侦听器是DefaultTraceListenerTextWriterTraceListenerEventLogTraceListener。它允许您指定级别(警告、错误、信息)和类别。

      Trace class on MSDN
      Writing to the Event Log in a Web Application
      UdpTraceListener - write log4net compatible XML messages to a log viewer such as log2console

      【讨论】:

      • +1 小小补充,当且仅当您使用 TRACE 预处理器符号编译时,Trace 才有效。
      • TextWriterTraceListener 需要注意的一点是它不做时间戳
      • 您可以重写TextWriterTraceListener中的WriteLine()方法,实现日志文件中的自动时间戳能力。请参阅this CodeProject article,第 6 节。
      • 不错的提示@user7116。我想提一下,使用 Trace 前身进行编译会降低性能;您可以在 "Project Properties>Build>Define TRACE constant" 中启用它。
      【解决方案5】:

      System.Diagnostics 中的内置跟踪在 .NET Framework 中很好,我在许多应用程序中使用它。但是,我仍然使用 log4net 的主要原因之一是内置的 .NET Framework 跟踪缺少 log4net 已经内置的许多有用的全功能附加程序。

      例如,除了 VB.NET dll 中的一个,实际上并没有在 .NET Framework 中定义一个好的滚动文件跟踪侦听器,它实际上并没有那么全功能。

      根据您的开发环境,我建议使用 log4net,除非第三方工具不可用,然后我会说使用 System.Diagnostics 跟踪类。如果你真的需要一个更好的 appender/tracelistener,你总是可以自己实现它。

      例如,我们的许多客户要求我们在其公司计算机上安装时不要使用开源库,因此在这种情况下,.NET Framework 跟踪类非常适合。

      另外 - http://www.postsharp.org/ 是我正在研究的 AOP 库,它也可能有助于记录,如代码项目中所示:http://www.codeproject.com/KB/dotnet/log4postsharp-intro.aspx

      【讨论】:

        【解决方案6】:

        正如我在另一个帖子中所说,我们已经在多个生产应用程序中使用 The Object Guy's Logging Framework 好几年了。它非常易于使用和扩展。

        【讨论】:

          【解决方案7】:

          我使用The Object Guy's Logging Framework-- 就像大多数尝试它的人一样。这家伙有一些有趣的comments

          【讨论】:

            【解决方案8】:

            您可以使用内置的 .NET 日志记录。查看 TraceSource 和 TraceListeners,它们可以在 .config 文件中进行配置。

            【讨论】:

              【解决方案9】:

              正如其他人所说,Log4Net 相当普遍,与 Log4j 相似,如果您使用任何 Java,它将为您提供帮助。

              您还可以选择使用日志记录应用程序块http://www.codeproject.com/KB/architecture/GetStartedLoggingBlock.aspx

              【讨论】:

                【解决方案10】:

                关于使用 System.Diagnostics 方法进行日志记录的几个 cmets,我还想指出 DebugView 工具非常适合在需要时检查调试输出 - 除非您需要它,应用无需生成日志文件,您只需在需要时启动 DebugView。

                【讨论】:

                  【解决方案11】:

                  另一个不错的日志库是NLog,它可以记录到很多不同的地方,例如文件、数据库、事件记录器等。

                  【讨论】:

                    【解决方案12】:

                    log4net 同上。我添加了我的两位,因为对于实际使用,查看一些开源实现以查看带有一些方便添加的真实世界代码示例是有意义的。对于 log4net,我建议不经意间查看subtext。特别看一下应用程序启动和程序集信息位。

                    【讨论】:

                      【解决方案13】:

                      Enterprise Librarylog4net 的可靠替代品,它还提供了许多其他功能(缓存、异常处理、验证等)。我几乎在我构建的每个项目中都使用它。

                      强烈推荐。

                      【讨论】:

                      • EL 甚至可以发送电子邮件作为日志记录的一部分。报告产品错误时非常方便。
                      【解决方案14】:

                      Log4Net 是一个相当全面的日志框架,它允许您记录到不同的级别(调试、错误、致命)并将这些日志语句输出到可能不同的位置(滚动文件、Web 服务、Windows 错误)

                      我可以通过创建记录器的实例轻松地在任何地方记录

                      private static readonly ILog _log = LogManager.GetLogger(typeof([Class Name]));
                      

                      然后记录错误。

                      _log.Error("Error messsage", ex);
                      

                      【讨论】:

                        【解决方案15】:

                        尽管我个人讨厌它,log4net 似乎是 C# 日志记录的事实标准。示例用法:

                        log4net.ILog log = log4net.LogManager.GetLogger(typeof(Program));
                        log.Error(“Some error”);
                        log.ErrorFormat("Error with inputs {0} and {1}", stringvar, intvar);
                        

                        【讨论】:

                        • 它完成了工作,但我讨厌文档,并且对花费大量时间修补配置文件并且基本上是盲目地飞行直到我可以让相对简单的事情按照我想要的方式工作而感到不满。
                        • 我使用过 log4net 并欣赏它是一个强大的工具(NHibernate 和其他人使用它)。但我很好奇为什么人们不喜欢使用 .NET 2.0 内置跟踪?使用不同类型的侦听器和一些工具,它似乎比 log4net(一个 java 端口)要简单得多。
                        • 可以听到你关于文档的信息(有点)。这就是为什么查看使用它的体面的开源项目的代码可以节省大量时间的原因。在那之后,它是迄今为止我最喜欢的日志记录实用程序。
                        • @Ted:一个好主意 - 你愿意推荐几个项目来学习日志记录吗?
                        猜你喜欢
                        • 2012-01-05
                        • 1970-01-01
                        • 1970-01-01
                        • 2013-06-30
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2013-01-10
                        相关资源
                        最近更新 更多