71

这个线程中,许多人表示他们使用 log4net。我是 TraceSources 的粉丝,想知道为什么要使用 log4net。

这就是我喜欢跟踪源的原因:

  • 可插入的侦听器 - XML、TextFile、Console、EventLog,您自己的
  • 可定制的跟踪开关(错误、警告、信息、详细、开始、结束、自定义)
  • 可定制的配置
  • 日志记录应用程序块只是一大组 TraceListeners
  • 活动/范围的相关性(例如,将 ASP.NET 请求中的所有日志与给定客户相关联
  • 服务跟踪查看器允许您分别针对这些活动可视化事件
  • 所有这些都可以在 app.config/web.config 中进行配置。

由于 .NET 框架内部使用 TraceSources,它还为我提供了一种配置跟踪的一致方式 - 使用 log4net,我必须配置 log4net 以及 TraceSources。

log4net 给了我什么 TraceSources 没有(或者无法通过编写几个自定义 TraceListeners 来完成)?

4

5 回答 5

56

在早期(.NET 1.0)中,.NET Framework 中的跟踪非常有限。

例如 TraceSource 分区直到 .NET 2.0 才出现,并且您只有四个级别(错误、警告、信息、详细),但如果您愿意,可以使用六个布尔开关进行分区。

log4j 在 Java 中很流行,因此得到了对 .NET 端口的大量支持,一旦它流行起来,它就一直保持这种状态,即使人们甚至没有正确使用它(例如,将它包装在单例记录器中并丢失它的主要特点)。

尽管如此,我仍然认为 log4net 和其他框架(例如 NLog、Common.Logging 甚至 EntLib)通过从头开始实现自己的日志系统而走错了路,即甚至改变了您编写日志语句的方式。

我更希望看到努力,特别是从 .NET 2.0 开始,用于扩展 .NET 中已有内容的坚实基础。对于确实扩展已有内容的项目,请查看 CodePlex ( http://essentialdiagnostics.codeplex.com/ ) 上的 Essential Diagnostics 项目。

log4net 的一些优势:

  • 如果您运行混合环境并想要一致的日志记录,它类似于 log4j。

  • 与您实现和必须配置的跟踪源数量相比,继承设置的自动记录器层次结构非常简洁。(尽管在某些情况下可能矫枉过正)。

  • log4net 已经有大约 28 个附加程序(相当于跟踪侦听器),而 System.Diagnostics 只有 10 个(但请参阅 Essential.Diagnostics 项目了解更多信息),所以如果你真的认为你可能需要 RemoteSyslogAppender、NetSendAppender、AnsiColorTerminalAppender 或 TelnetAppender,那么你很幸运。

缺点(与 System.Diagnostics 相比):

  • 您需要使用不同的日志记录语法,因此如果您已经在使用 source.TraceEvent(),则需要检查并替换所有内容。

  • 这也扩展到不同的关联语法,因此您需要从 CorrelationManager 更改为 log4net 上下文。

  • 不容易与框架跟踪(例如 WCF)集成。

  • 对事件 ID 的支持不佳(需要使用单独的扩展项目 IEventLog)。

  • 尚不支持 Windows (Vista) 的事件跟踪或服务跟踪查看器 XML 格式。

于 2009-06-03T16:37:06.997 回答
9

我认为 log4net 正在做你为我列出的所有事情。

可插拔监听器听起来像附加器——它们有很多,事实上我什至破解了滚动日志文件以始终以 .log 结尾(用于文件关联),在电子邮件附加器中添加了一个 cc 字段,最后调整了我最喜欢的值彩色控制台附加程序。如果我可以这么大胆——我的彩色控制台幸福:

<appender name="ColoredConsoleAppender" type="log4net.Appender.ColoredConsoleAppender">
<!-- Can Use:
        Blue
        Green
        Red
        White
        Yellow
        Purple
        Cyan
        HighIntensity
        -->
<mapping>
  <level value="FATAL" />
  <foreColor value="Yellow, HighIntensity" />
  <backColor value="Red" />
</mapping>
<mapping>
  <level value="ERROR" />
  <foreColor value="White" />
  <backColor value="Purple, HighIntensity" />
</mapping>
<mapping>
  <level value="WARN" />
  <backColor value="Blue" />
  <foreColor value="White" />
</mapping>
<mapping>
  <level value="INFO" />
  <backColor value="Green" />
  <foreColor value="White" />
</mapping>
<mapping>
  <level value="DEBUG" />
  <foreColor value="White" />
</mapping>
<layout type="log4net.Layout.PatternLayout">
  <!--<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />-->
  <!--<conversionPattern value="%-5level %file:%line - %message%newline" />-->
  <conversionPattern value="%level %logger:%line %newline     %message%newline" />
</layout>

可定制的跟踪开关:Log4net 仅附带 FATAL ERROR WARN INFO DEBUG 以增加详细程度。我真正想念的唯一一个是 AUDIT for who-did-what 日志记录。

可定制的配置:我使用在运行时加载的 log4net.config 文件(或将日志写入 c:\ 抱怨我找不到配置。)

    Try
        ' Get log4net configuration from file
        Dim logConfigFile As FileInfo
        logConfigFile = New FileInfo(".\log4net.config")

        If logConfigFile.Exists Then
            XmlConfigurator.Configure(logConfigFile)
        Else
            CreateEmergenceLogFile(logConfigFile.FullName)
        End If

    Catch ex As Exception
        Console.Out.WriteLine("Could not load the log4net config file")
    End Try

只是一大组 TraceListeners:抱歉跳过那个 - 我会相信你的话。

活动/范围的相关性:您的意思是每个文件(读取类)都有自己的命名日志,可以有单独的日志级别阈值。实际上,您甚至可以在单个类中对日志记录进行分段(实际上,这可能已经做得太多了……)

在类文件中:

    Private Shared _logger As log4net.ILog = _
log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType)

Private Shared _loggerAttribute As log4net.ILog = _
log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.FullName & ".Attribute")

Private Shared _loggerCache As log4net.ILog = _
log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.FullName & ".Cache")

服务跟踪查看器:在 log4net.config 中:

  <logger name="NipissingU.ADWrapper.EntryTools.Attribute">
    <level value="INFO" />
  </logger>
  <logger name="NipissingU.ADWrapper.EntryTools.Cache">
    <level value="WARN" />
  </logger>

所有这些都可以在 app.config/web.config 中进行配置:也许这在 ASP.NET 中是件好事,我不知道,但是在制作富客户端 bean 计数应用程序时,我喜欢单独的配置文件。

这里的一切都只是我自己的小使用技巧。

hth,-迈克

于 2009-02-23T04:47:38.857 回答
4

使用 TraceSources 而不是 Log4Net 的另一个原因是 Tracing 本身:Log4Net 只能用于 Logging(消息),但是如何跟踪一个 Object(同时多个信息)?当然 Log4Net 实现了很多 Listeners,但我需要所有这些吗?在大多数情况下不是。如果我需要一个特殊的监听器,实现我自己的监听器并不难,不是吗?例如,我需要一个侦听器来跟踪数据库(不仅是消息,而且同时还有不同的信息 {string's, int's, etc.})。

我是对的吗?

于 2010-04-28T09:07:07.383 回答
3

我更喜欢 Log4Net 而不是使用 Trace one of Targeting 的原因 - 使用 Log4Net,我可以独立地检测我的应用程序的不同层(数据访问、服务、业务逻辑等)和不同的子系统(身份验证、处理等)并打开/独立地关闭每个子系统的日志记录。

这种灵活性允许我为一个子系统配置详细的日志记录,而无需打开整个系统的消防软管。

Trace 类上提供的静态方法 [例如 TraceInformation()] 没有提供任何方法来指定日志记录来自哪个子系统,因此通过编写我自己的 TraceListener 不容易提供。

另一个原因是性能 - 我的应用程序可能每秒记录数千条消息。Log4Net 的开销很低。相比之下,上次我查看它时,日志应用程序块为记录的每条消息重新解析其 XML 配置,这使得该块非常沉重和缓慢。

于 2009-02-23T04:03:16.187 回答
0

虽然我只知道 log4net 的工作方式,但使用该框架的一个明显好处是那些习惯使用 log4j 的人立即熟悉。

另一个小好处是使用 log4net 测试驱动日志记录非常简单;记录器实现 log4net.ILog。同样,我不熟悉 Microsoft 解决方案,但我想知道如何在不首先为 System.Diagnostics.Trace 类编写外观的情况下做到这一点。

粗略地看一下跟踪源文档,我找不到布局的等价物,并且有兴趣知道是否存在这样的等价物。PatternLayout 对于使用常见数据(如日期戳、线程信息、日志上下文等)格式化日志条目非常方便。 Log4net PatternLayout 文档:http ://logging.apache.org/log4net/release/sdk/log4net.Layout.PatternLayout.html

此外,考虑到为日志框架编写扩展可能是一个经典的“元问题”,log4net 确实为表格提供了一个可插入侦听器等效项的庞大列表。

附加程序列表:http: //logging.apache.org/log4net/release/config-examples.html

于 2009-05-30T12:45:00.800 回答