C 语言中的错误日志记录#

Error logging in C#

提问人:Rodney Schuler 提问时间:9/29/2008 最后编辑:Rodney Schuler 更新时间:11/18/2018 访问量:94318

问:

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

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

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

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

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

编辑:在我问这个问题的时候,我真的是 .NET 的新手,不知道 System.Diagnostics.Trace。System.Diagnostics.Trace 是我当时需要的。从那时起,我就在日志记录要求更大、更复杂的项目中使用 log4net。只需编辑 500 行 XML 配置文件,log4net 就会完成您需要的一切:)

C# 错误报告 错误日志记录

评论


答:

5赞 Ben Hoffstein 9/29/2008 #1

尽管我个人讨厌它,但 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赞 Ben Hoffstein 9/29/2008
它完成了工作,但我讨厌文档,并且对花了很多时间修补配置文件并且基本上是盲目飞行感到不满,直到我可以让相对简单的东西按照我想要的方式工作。
4赞 Chris S 9/29/2008
我使用过log4net,并欣赏它是一个强大的工具(NHibernate和其他人使用它)。但我很好奇为什么人们不喜欢使用 .NET 2.0 内置跟踪?有了不同类型的侦听器和一些工具,它似乎比 log4net 要混乱得多,log4net 是一个 java 端口。
0赞 Ted 10/1/2008
可以听到你关于文档的信息(有点)。这就是为什么查看使用它的体面的开源项目的代码可以节省大量时间的原因。在那之后,它是迄今为止我最喜欢的日志记录实用程序。
0赞 fostandy 12/16/2009
@Ted:一个好主意 - 你愿意推荐几个项目来学习日志吗?
41赞 Mitch Wheat 9/29/2008 #2

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

评论

0赞 Kos 8/10/2012
“在每个类的开头,声明一个记录器实例,如下所示...”你把我弄丢了。:-)
3赞 FryHard 9/29/2008 #3

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

我能够通过创建记录器的实例轻松地在任何地方进行记录

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

然后记录错误。

_log.Error("Error messsage", ex);
11赞 Eric Schoonover 9/29/2008 #4

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

强烈推荐。

评论

1赞 StingyJack 9/29/2009
EL 甚至可以发送电子邮件作为日志记录的一部分。报告生产错误时非常方便。
1赞 Ted 9/29/2008 #5

log4net 同上。我之所以添加我的两位,是因为对于实际使用,查看一些开源实现以查看带有一些方便添加的实际代码示例是有意义的。对于log4net,我建议从头顶上看潜台词。特别要看一下应用程序启动和 assemblyinfo 位。

14赞 Mats Fredriksson 9/29/2008 #6

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

74赞 Chris S 9/29/2008 #7

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

System.Diagnostics.Trace

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

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

评论

20赞 user7116 9/29/2009
+1 小加法,当且仅当您使用 TRACE 预处理器符号进行编译时,Trace 才处于活动状态。
1赞 Chris S 4/9/2010
使用 TextWriterTraceListener 需要注意的一件事是它不做时间戳
6赞 Robert Harvey 10/8/2010
您可以覆盖 中的方法,以实现日志文件中的自动时间戳功能。请参阅此 CodeProject 文章的第 6 节。WriteLine()TextWriterTraceListener
0赞 Mahmood Jenami 9/3/2015
不错的小费@user7116。我想提一下,使用 Trace 前身编译会降低性能;您可以在“项目属性>构建>定义 TRACE 常量”中启用它。
1赞 Chris Ballard 9/29/2008 #8

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

0赞 Mario 9/29/2008 #9

正如其他人所说,Log4Net 相当常见,类似于 Log4j,如果您曾经做过任何 Java,它会对您有所帮助。

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

2赞 CSharpAtl 9/29/2008 #10

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

14赞 TheRaven 2/8/2009 #11

我使用 The Object Guy 的日志记录框架——就像大多数尝试它的人一样。这家伙对此有一些有趣的评论

5赞 S. Mills 8/11/2009 #12

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

1赞 Wil P 9/29/2009 #13

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 库,它也可能有助于日志记录,如代码 project:http://www.codeproject.com/KB/dotnet/log4postsharp-intro.aspx 所示。

3赞 Nicholas Blumhardt 3/23/2014 #14

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

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

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

这个想法是,如果你对日志使用“NoSQL”样式的数据存储,你可以记录如下事件:

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

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

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

在这种情况下,该属性将被调用(而不是),使查询和关联更容易。Name0

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

1赞 gmsi 7/1/2016 #15

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

评论

1赞 Blake Niemyjski 7/7/2017
我从事 Exceptionless 项目,非常乐意回答任何问题。我们为所有主要的日志记录框架提供了日志记录目标,因此你可以通过使用 Exceptionless(免费日志消息 + 未经处理的异常)来获得大量开箱即用的价值