代码之家  ›  专栏  ›  技术社区  ›  Paul Stovell

log4net与tracesource[关闭]

  •  68
  • Paul Stovell  · 技术社区  · 17 年前

    this thread 许多人表示他们使用log4net。我是一个追踪源爱好者,想知道为什么使用log4net。

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

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

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

    log4net给了我哪些tracesources不能(或者不能通过编写几个自定义的traceListener来完成的)?

    5 回复  |  直到 15 年前
        1
  •  9
  •   Mike Bonnell    17 年前

    我认为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只提供致命的错误警告信息调试,以增加详细程度。我唯一真正错过的是审核谁做了什么日志记录。

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

        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
    

    只是一大组跟踪监听器:很抱歉跳过那个-我相信你的话。

    活动/作用域的相关性:您的意思是像每个文件(读类)都得到自己的命名日志一样,它可以有单独的日志级别阈值。事实上,即使在一个类中,您也可以分段日志记录(事实上,这可能已经变得太多了…)

    在类文件中:

        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 -迈克

        2
  •  55
  •   Sly Gryphon    15 年前

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

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

    Log4J在Java中很受欢迎,因此得到了对.NET端口的大量支持,一旦它流行起来,它就一直保持这种方式,即使人们甚至没有正确地使用它(例如,将它封装在单日志记录器中并失去它的主要特征)。

    不过,我认为log4net和其他框架(例如nlog、common.log g in g,甚至entlib)从一开始就实现了自己的日志系统,甚至改变了日志语句的编写方式。

    我更愿意看到努力,特别是自从.NET 2.0投入到扩展.NET中已有内容的坚实基础中。对于一个确实扩展了已有内容的项目,请看一下CodePlex上的基本诊断项目。( http://essentialdiagnostics.codeplex.com/ )

    log4net的一些优势:

    • 如果您运行混合环境并希望一致的日志记录,那么它与log4j类似。

    • 继承设置的自动记录器层次结构与您实现并必须配置每个跟踪源的数量相比非常整洁。(尽管在某些情况下可能是杀伤力过大)。

    • log4net已经有大约28个附加程序(相当于跟踪侦听器),而system.diagnostics只有10个附加程序(但更多信息请参阅Essential.diagnostics项目),因此如果您真的认为您可能需要RemoteSyslogAppender、Netsendappeder、AnsicolorTerminalAppender或TelnetAppender,那么您就走运了。

    缺点(与System.Diagnostics相比):

    • 您需要使用不同的日志语法,所以如果您已经在使用source.traceEvent(),那么您需要遍历并替换所有内容。

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

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

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

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

        3
  •  4
  •   Mogerli    16 年前

    使用tracesources而不是log4net的另一个原因是跟踪本身: log4net只能用于日志记录(消息),但是如何跟踪一个对象(同时跟踪多个信息)? 当然,log4net实现了很多侦听器,但是我需要所有这些吗? 在大多数情况下不是。 如果我需要一个特别的倾听者,实现我自己的倾听者就不难了,不是吗? 例如,我需要一个侦听器跟踪到数据库中(不仅是消息,而且是不同的信息字符串、int等同时)。

    我是对的吗?

        4
  •  3
  •   Bevan    17 年前

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

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

    跟踪类[例如traceInformation()]上提供的静态方法没有提供任何方法来指定日志记录来自哪个子系统,因此编写自己的traceListener并不容易提供这种方法。

    另一个原因是性能——我的应用程序中有一部分可能每秒记录几千条消息。log4net的开销很低。相比之下,上次我查看它时,日志应用程序块为记录的每一条消息重新准备了XML配置,这使得块非常沉重和缓慢。

        5
  •  0
  •   Jim Burger    17 年前

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

    另一个小的好处是,使用log4net测试驱动日志非常简单;记录器实现log4net.ilog。同样,我不熟悉微软的解决方案,但我想知道如果不先向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