C#日志记录。我应该使用什么?

28
我正在考虑更换新的统一日志记录解决方案,用于我们新产品线的使用,并想知道Stack Overflow上的一些人的想法。我们需要记录各种应用程序的日志:ASP .net、Windows服务、web服务、wpf应用等等。我们只使用Windows操作系统。
我们对日志记录解决方案的一些要求包括: 1)日志文件管理。
- Ability to split files up over a certain size
- Ability to auto archive/delete after certain period of time

2) 能够在特定类型的消息(例如错误)被记录时发送电子邮件的能力。

3) 能够将消息写入Windows事件日志的能力。

- We need to be able to specify where it's being written in the event log. 
  It would also be nice if it would automatically create the event log source if it does exist.

我已经开始研究nLog、Windows Trace和log4net。我不仅限于这三个,只是在搜索时经常出现。


1
log4net是迄今为止最常用的日志记录框架,支持所有这些要求。这是我会使用的框架,但你的情况可能有所不同。 - Thorarin
5
试试这个链接:http://stackoverflow.com/search?q=[.net]+logging,你会找到很多有趣的答案。 - Ladislav Mrnka
重复,但Cole W提出了一些他考虑到的具体要求,这是关于这个问题的好处。 - Marijn
7个回答

18

3
如果你想要一些容易实现的东西,那么这不是一个好选择。当然,如果你已经是log4net的用户,那么它可能很容易上手。但对于从未使用过它的人来说,设置它会很麻烦。 - Pedro
1
比起编写自己的日志框架,这个要容易得多! - RichardOD
1
@Pedro,你正在实现什么?你可以找到app.config示例来设置记录器。 - Stealth Rabbi
如果你愿意阅读文档,那么实现Log4非常容易。 - gbtimmon
@Pedro,你有其他的建议吗? - JHixson
最近,我一直在使用Serilog:http://serilog.net/。它可以直接易用,并支持结构化日志记录(不仅仅是文本记录)。 - RQDQ

11

使用.NET通用日志记录。您可以稍后选择特定的提供程序(如NLog、CLog、log4net...),甚至创建自定义提供程序。


4
如果我想避免依赖于.NET公共日志记录,该怎么办?说实话,这对我来说似乎是一个不必要的抽象层。log4net等本身就是日志记录的抽象 - 我为什么要想要用另一个替代它们,而这个原因又不是反对使用.NET公共日志记录的理由呢? - Kent Boogaart
7
这类似于Java的Apache Commons Logging,对于它的存在性也同样适用。假设你正在编写将在其他代码中使用的库,你不想规定与你的库交互的任何代码必须使用哪个日志记录框架,因为这意味着客户端必须配置您特定的框架。比如,如果您决定使用log4net,另一个库使用NLog,则客户端必须同时具备这两个库的配置才能使用两个库。Commons允许您从客户端代码继承日志记录框架。 - Ceilingfish

10

再来一个: NLog

  • 文件 – 单个或多个文件,带有自动文件命名和存档功能
  • 事件日志 – 本地或远程数据库 – 将日志存储在受支持的数据库中
  • .NET网络 – 使用TCP、UDP、SOAP、MSMQ协议
  • 命令行控制台 – 包括消息颜色编码
  • 电子邮件 – 每当应用程序错误发生时,您可以收到电子邮件
  • ASP.NET跟踪
  • 等等

我在之前的项目中使用了NLog,发现它比Log4Net更容易配置(后者出现了莫名其妙的问题)。 - Shimrod

3

1
我们在使用那个东西时遇到了非常糟糕的经历 - 在Web服务器上,它记录并锁定了文件(也就是说,没有及时释放),因此下一个日志会被写入其他以GUID命名的文件中... 对于任何生产环境来说都非常不实用... - veljkoz
1
听起来你试图从多个进程(或使用指向同一文件的多个TraceListeners)记录到同一个文件。请参见:https://dev59.com/YUrSa4cB1Zd3GeqPVEt- 。自从发布以来,我一直在企业生产环境中使用Enterprise Library,并且我有非常好的经验。 - Randy Levy

1
请参考以下问题的综合答案:何时使用 Tracing vs Logger.NET、Enterprise Library、log4net 或 Ukadc.Diagnostics? 简而言之,可用的主要日志框架包括内置的 .NET Framework System.Diagnostics、log4net、NLog 和 Enterprise Library Logging Application Block。
可以在此处比较这些主要框架:https://essentialdiagnostics.codeplex.com/wikipage?title=Comparison 所有上述主要框架都支持滚动文件,但是我认为它们将清理留给了您。
例如,过去我曾使用预定的 Windows 作业,该作业使用带有“/mov /minage X”的 robocopy 将旧文件移动到其他位置,然后删除或执行其他操作。
最近我写了一篇关于System.Diagnostics中使用的EventSchemaTraceListener,它有一个LimitedCircularFiles选项,但是没有很好的工具支持查看日志(它们是XML格式)。
2) 能够在记录某些类型的消息时发送电子邮件(例如错误)。
以上列出的所有主要框架都直接或通过扩展(额外的侦听器)支持此功能。
3) 能够将消息写入Windows事件日志。
同样,所有主要框架都支持此功能,但我通常建议直接而非通过跟踪来写入Windows事件日志。
其中一个问题是您问到自动创建源的问题。
任何写入事件日志(经过EventLog.WriteEvent)的操作都会在第一条日志消息上自动尝试创建源 - 问题在于安全性,只有管理员允许创建源,因此以普通用户身份运行时会失败。
由于这个原因,您确实需要添加一个EventLogInstaller,以便在安装时创建源(由管理员完成安装)。一旦创建,任何进程都可以写入源。
因此,我建议您需要在代码中创建和写入事件日志,以确保事件日志源相同。此外,如果通常写入事件日志,您不希望通过错误配置“关闭”它。
我的个人建议是使用开箱即用的.NET Framework System.Diagnostics,特别是Service Trace Viewer非常适合诊断问题,特别是在使用WCF的多层,多线程环境中,它可以跨层传递关联标识。

0

你可以创建自己的日志库... 我就是这么做的。

看一下PostSharp http://www.sharpcrafters.com/,他们有一些基本日志系统的很好的例子。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接