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

C#记录。我应该用什么?,c#,windows,logging,C#,Windows,Logging,我正在考虑切换到一个新的统一日志解决方案,用于我们的新产品线,我想看看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 pe

我正在考虑切换到一个新的统一日志解决方案,用于我们的新产品线,我想看看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跟踪和log4net。我不局限于这3个,只是在搜索时出现了一些。你可以看看企业库,它们有一个可扩展的日志应用程序块


您可以下载开发指南pdf,他们有一个关于日志记录的部分(第4章)

log4net总是一个不错的选择

还有另外一个:

  • 文件–单个文件或多个文件,带有 自动文件命名和归档
  • 事件日志-本地或远程数据库- 将日志存储在受支持的数据库中
  • 通过.NET网络–使用TCP、UDP、, SOAP、MSMQ协议
  • 命令行控制台–包括 信息
  • 电子邮件–您可以收到 应用程序出错时发送电子邮件 发生
  • ASP.NET跟踪
  • 还有更多

使用。您可以稍后选择特定的提供程序(NLog、CLog、log4net…),甚至创建自定义的提供程序。

您可以创建自己的日志库。。。是的


看看PostSharp,他们有一些基本测井系统的非常好的例子。

请参阅此问题以获得另一个全面的答案:

简而言之,可用的主要日志框架是内置的.NET Framework System.Diagnostics、log4net、NLog和企业库日志应用程序块

有关这些主要框架的比较,请访问:

1) 日志文件管理

- Ability to split files up over a certain size
- Ability to auto archive/delete after certain period of time
上面列出的所有主要框架都支持滚动文件,但我认为它们将清理工作留给您

e、 g.在过去,我使用了一个计划的Windows作业,该作业使用带有“/mov/minage X”的robocopy将旧文件移到其他位置,然后删除或其他任何内容

System.Diagnostics中使用的EventSchemaTraceListener有一个LimitedCircularFiles选项,但没有太多工具支持查看日志(它们是XML格式的)

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.
同样,所有主要框架都支持这一点,但是我通常建议直接写入Windows事件日志,而不是通过跟踪

其中一个问题是关于自动创建源的问题

任何对事件日志的写入(通过EventLog.WriteEvent)都将自动尝试在第一条日志消息上创建源(如果它不存在)——问题在于安全性,只允许管理员创建源,因此作为普通用户运行将失败

因此,您确实需要添加EventLogInstaller,以便在安装时创建源代码(安装由管理员完成)。创建后,任何进程都可以写入源

因此,我建议您需要在代码中创建并写入事件日志,以确保事件日志源相同。此外,如果写入事件日志,通常您不希望通过错误配置“关闭”

我个人建议使用现成的.NET Framework系统。Diagnostics(尤其是Service Trace Viewer)非常适合诊断问题,特别是在多层多线程环境中,如果使用WCF,它可以跨层传递关联标识。


是一个非常简单的库,如果您对性能有很高的要求,这是一个非常好的库。

log4net是目前最常用的库,并且支持所有这些要求。这是我会使用的一个,但是YMMV。试试这个:你会发现很多有趣的答案。重复,但是Cole W确实提出了一些他想到的具体要求,这对这个问题很好。我在我以前的项目中使用了NLog,发现它比Log4Net更容易配置(这不起作用,令人费解)。我们有过非常糟糕的经历-在web服务器上,它记录并锁定了文件(也就是说,它没有及时发布另一个日志),所以下一个日志转到另一个以GUID为名称的文件。。。对于任何生产环境来说都是非常不切实际的…听起来好像您试图从多个进程(或使用多个指向同一文件的
tracelistener
)登录到同一文件。请参阅:。自从发布以来,我一直在企业生产环境中使用企业库,而且我有很好的经验。但是,如果我想避免对.NET通用日志的依赖,该怎么办?老实说,这对我来说似乎是一个不必要的抽象层。log4net等本身就是对日志的抽象——我有什么可能的理由想要将一个日志交换为另一个日志,而这不是反对使用.NET公共日志的理由?这与apache commons logging for Java类似,同样的理由也适用于它的存在。假设您正在编写将在其他代码中使用的库。您不想指定在与库交互的任何代码中使用哪个日志框架,因为这意味着客户机必须为您的特定框架配置。假设您决定使用log4net,另一个库使用NLog,那么客户端必须同时拥有这两个库