提问人:Rodney Schuler 提问时间:9/29/2008 最后编辑:Rodney Schuler 更新时间:11/18/2018 访问量:94318
C 语言中的错误日志记录#
Error logging in C#
问:
我正在从 C++ 编码切换到 C#。我需要用 C# 中的类似内容替换我的 C++ 错误日志记录/报告宏系统。
在我的C++源代码中,我可以写
LOGERR(“一些错误”); 或 LOGERR(“输入 %s 和 %d 出错”, stringvar, intvar);
然后,宏和支持库代码将(可能是varargs)格式化的消息与源文件,源行,用户名和时间一起传递到数据库中。相同的数据也被塞进数据结构中,以便以后向用户报告。
是否有人有 C# 代码片段或指向执行此基本错误报告/日志记录的示例的指针?
编辑:在我问这个问题的时候,我真的是 .NET 的新手,不知道 System.Diagnostics.Trace。System.Diagnostics.Trace 是我当时需要的。从那时起,我就在日志记录要求更大、更复杂的项目中使用 log4net。只需编辑 500 行 XML 配置文件,log4net 就会完成您需要的一切:)
答:
尽管我个人讨厌它,但 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。这篇文章涵盖了您入门所需的大部分内容。
评论
Log4Net 是一个相当全面的日志框架,它允许您记录到不同的级别(调试、错误、致命)并将这些日志语句输出到不同的地方(滚动文件、Web 服务、Windows 错误)
我能够通过创建记录器的实例轻松地在任何地方进行记录
private static readonly ILog _log = LogManager.GetLogger(typeof([Class Name]));
然后记录错误。
_log.Error("Error messsage", ex);
Enterprise Library 是 log4net 的可靠替代品,它还提供了许多其他功能(缓存、异常处理、验证等)。我几乎在我构建的每个项目中都使用它。
强烈推荐。
评论
log4net 同上。我之所以添加我的两位,是因为对于实际使用,查看一些开源实现以查看带有一些方便添加的实际代码示例是有意义的。对于log4net,我建议从头顶上看潜台词。特别要看一下应用程序启动和 assemblyinfo 位。
另一个很好的日志库是 NLog,它可以记录到许多不同的地方,例如文件、数据库、事件记录器等。
这里有很多log4net的拥护者,所以我确信这将被忽略,但我会添加我自己的偏好:
System.Diagnostics.Trace
这包括侦听方法,然后写入日志文件/输出窗口/事件日志的侦听器,框架中包含的侦听器是 和 .它允许您指定级别(警告、错误、信息)和类别。Trace()
DefaultTraceListener
TextWriterTraceListener
EventLogTraceListener
MSDN
上的 Trace 类 写入 Web 应用程序
中的事件日志 UdpTraceListener - 将 log4net 兼容的 XML 消息写入日志查看器,例如 log2console
评论
WriteLine()
TextWriterTraceListener
除了使用 System.Diagnostics 方法进行日志记录的几条评论之外,我还想指出,DebugView 工具非常简洁,可以在需要时检查调试输出 - 除非您需要它,否则应用程序无需生成日志文件,只需在需要时启动 DebugView。
正如其他人所说,Log4Net 相当常见,类似于 Log4j,如果您曾经做过任何 Java,它会对您有所帮助。
您还可以选择使用日志记录应用程序块 http://www.codeproject.com/KB/architecture/GetStartedLoggingBlock.aspx
可以使用内置的 .NET 日志记录。查看 TraceSource 和 TraceListeners,可以在 .config 文件中配置它们。
我使用 The Object Guy 的日志记录框架——就像大多数尝试它的人一样。这家伙对此有一些有趣的评论。
正如我在另一个帖子中所说,我们已经在多个生产应用程序中使用了 The Object Guy 的日志记录框架好几年了。它非常易于使用和扩展。
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 所示。
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 的产品,它提供此类结构化日志事件的存储和查询。
ExceptionLess 是可用于日志记录的最简单的 nuget 包之一。它是一个开源项目。它会自动处理未经处理的异常,并且提供了手动日志的选项。您可以登录到本地服务器上的在线或自托管。
评论