73

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

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

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

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

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

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

4

15 回答 15

73

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

System.Diagnostics.Trace

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

MSDN 上的跟踪类在
Web 应用程序
UdpTraceListener 中写入事件日志 - 将与 log4net 兼容的 XML 消息写入日志查看器,例如 log2console

于 2008-09-29T09:41:56.560 回答
41

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

于 2008-09-29T04:59:22.793 回答
14

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

于 2008-09-29T09:38:50.593 回答
14

我使用The Object Guy 的日志框架——大多数尝试过它的人也是如此。这家伙对此有一些有趣的评论

于 2009-02-08T04:17:04.940 回答
11

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

强烈推荐。

于 2008-09-29T05:08:41.897 回答
5

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

log4net.ILog log = log4net.LogManager.GetLogger(typeof(Program));
log.Error(“Some error”);
log.ErrorFormat("Error with inputs {0} and {1}", stringvar, intvar);
于 2008-09-29T04:59:15.947 回答
5

正如我在另一个线程中所说,我们已经在多个生产应用程序中使用The Object Guy 的日志框架好几年了。它非常易于使用和扩展。

于 2009-08-11T01:35:07.913 回答
3

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

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

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

然后记录错误。

_log.Error("Error messsage", ex);
于 2008-09-29T05:00:53.663 回答
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的产品,它提供对这些类型的结构化日志事件的存储和查询。

于 2014-03-22T21:52:48.110 回答
2

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

于 2008-09-29T15:24:04.150 回答
1

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

于 2008-09-29T05:35:46.917 回答
1

除了关于使用 System.Diagnostics 方法进行日志记录的几条评论之外,我还想指出DebugView工具非常适合在需要时检查调试输出 - 除非您需要它,否则不需要要生成日志文件的应用程序,您只需在需要时启动 DebugView。

于 2008-09-29T13:01:57.203 回答
1

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

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

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

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

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

于 2009-09-28T19:56:05.293 回答
1

ExceptionLess是可用于日志记录的最简单的 nuget 包之一。它是一个开源项目。它会自动处理未处理的异常,并提供手动日志选项。您可以登录到本地服务器上的在线或自我主机。

于 2016-07-01T13:14:12.440 回答
0

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

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

于 2008-09-29T14:58:11.013 回答