在C#中记录错误


73

我正在从C ++编码转换为C#。我需要用C#中的类似内容替换C ++错误日志记录/报告宏系统。

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

LOGERR(“ Some error”); 或LOGERR(“输入%s和%d输入错误”,stringvar,intvar);或

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

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

编辑: 当时我问这个问题,我真的是.NET的新手,并且不知道System.Diagnostics.Trace。当时我需要System.Diagnostics.Trace。从那时起,我就在日志记录需求更大且更为复杂的项目上使用了log4net。只需编辑500行XML配置文件,log4net就可以完成您将需要的所有事情:)

Answers:


72

这里有很多log4net倡导者,因此我敢肯定这将被忽略,但是我将添加自己的偏好:

System.Diagnostics.Trace

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

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


20
+1小添加,且仅当您使用TRACE预处理器符号进行编译时,Trace才有效。
user7116

1
TextWriterTraceListener需要注意的一件事是它不做时间戳记
Chris S 2010年

6
您可以覆盖中的WriteLine()方法以TextWriterTraceListener在日志文件中实现自动时间戳功能。见这CodeProject上的文章,第6节
罗伯特·哈维

不错的提示@ user7116。我想提一下,使用Trace的前身进行编译会降低性能。并可以在“项目属性>生成>定义TRACE常量”中启用它。
Mahmood Jenami

40

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


“在每个类的开始处,按如下方式声明一个记录器实例……”您在那里迷失了我。:-)
Kos 2012年




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);

12
它可以完成工作,但是我讨厌文档,对我花了很多时间修改配置文件并且基本上是盲目地感到讨厌,直到我可以按照我想要的方式来做相对简单的事情为止。
本·霍夫斯坦

4
我使用过log4net,并赞赏它是一个功能强大的工具(NHibernate和其他人使用它)。但是我很好奇为什么人们不喜欢使用.NET 2.0内置跟踪?使用不同类型的侦听器和一些工具,似乎比log4net(它是一个Java端口)少很多。
克里斯S

可以听到您有关文档的信息(有点)。这就是为什么查看使用它的体面的开源项目代码可以节省大量时间的原因。之后,这是迄今为止我最喜欢的日志记录实用程序。
Ted

@Ted:一个好主意-您是否愿意推荐几个项目以了解日志记录?
fostandy


3

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

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

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

然后记录错误。

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

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表存储对于DIY似乎很受欢迎。我最初构建了Serilog(尽管它是一个社区项目),但现在正在开发一个名为Seq的产品,该产品可以存储和查询这类结构化日志事件。


2

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


1

与log4net相同。我添加我的两位是因为为了实际使用,有必要查看一些开源实现,以查看带有一些方便添加的真实世界代码示例。对于log4net,我建议先抬头看着subtext。特别要看一下应用程序的start和assemblyinfo位。


1

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


1

.NET Framework中System.Diagnostics中的内置跟踪很好,我在许多应用程序中都使用了它。但是,我仍然使用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


1

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


1
我从事Exceptionless项目,很乐意回答任何问题。我们为所有主要的日志记录框架提供了日志记录目标,因此您可以使用Exceptionless(免费日志消息+未处理的异常)立即获得很多价值
Blake Niemyjski

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.