log4net与TraceSource [关闭]


70

此线程中,许多人表示他们使用log4net。我是TraceSources的迷,并且想知道为什么使用log4net。

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

  • 可插拔侦听器-XML,TextFile,控制台,EventLog,自行滚动
  • 可自定义的跟踪开关(错误,警告,信息,详细,开始,结束,自定义)
  • 可定制的配置
  • 记录应用程序块只是大量的TraceListeners
  • 活动/范围的关联(例如,将ASP.NET请求中的所有日志与给定客户相关联
  • 通过Service Trace Viewer,您可以可视化针对这些活动的事件
  • 所有这些都可以在app.config / web.config中进行配置。

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

log4net给我什么,TraceSources不给我(或者通过编写几个自定义TraceListeners不能做到)?


24
我发现这个问题值得一提,并且还找到了一些答案,这些信息足以提供信息,因此我不再需要搜索更多信息。谁以“不具建设性”的态度来解决这个问题,我质疑是否由于对log4net的偏见以及对收到的答案的普遍不满而完成了该问题。这个问题和许多答案有助于澄清围绕log4net和.NET跟踪的恐惧,不确定性,怀疑和明显的错误信息。
肖恩·威尔逊

3
我也发现这个问题很有帮助。而且实际上完全符合我的需求。
乔纳森·阿尔法罗

Answers:


9

我认为log4net正在为您列出的所有内容。

可插拔侦听器听起来像附加器,实际上有很多附加器,实际上,我什至修改了滚动日志文件,使其始终以.log结尾(用于文件关联),在电子邮件附加器中添加了抄送字段,并最终调整了我喜欢的值彩色的控制台附加程序。如果我这么大胆-彩色控制台的幸福感:

<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:\抱怨找不到我的配置。)

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


谢谢迈克。关联稍有不同-您可以将Guid和有关日志“上下文”的元数据相关联-从那里直到上下文“关闭”的所有跟踪都与此上下文相关。便于查看与特定订单或客户相关的所有日志,例如
Paul Stovell

相比之下,每个客户/订单具有不同的日志文件可能会很烦人
Paul Stovell 09年

尽管我还没有尝试过,但上下文也支持嵌套,尽管我还没有尝试过
Paul Stovell 2009年

36
迈克,您几乎已经确认log4net可以完成.NET Framework中TraceSource已内置的所有功能。问题是“ log4net给我的是TraceSources没有给我的东西吗?”,即,log4net除了普通的.NET还能提供什么?
狡猾的狮

来源?我已经调整了几件事。...但是我不是想卖给任何人,只是说我让X运作良好,但并不会削弱Y
Mike Bonnell 2010年

56

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

例如,直到.NET 2.0才开始TraceSource分区,并且您只有四个级别(错误,警告,信息,详细),尽管您可以根据需要使用六个布尔开关进行分区。

log4j在Java中很流行,因此获得了对.NET端口的大量支持,一旦流行起来,即使人们没有正确使用它(例如将其包装在Singleton记录器中并丢失)这是主要功能)。

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

我将更愿意看到付出的努力,尤其是因为.NET 2.0投入了扩展.NET已经存在的坚实基础的努力。对于确实可以扩展现有项目的项目,请查看CodePlex上的Essential Diagnostics项目(http://essentialdiagnostics.codeplex.com/)。

log4net的一些优点:

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

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

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

缺点(与System.Diagnostics相比):

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

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

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

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

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


4

使用TraceSources代替Log4Net的另一个原因是跟踪自身:Log4Net仅可用于记录(消息),但如何跟踪对象(同时包含多个信息)?当然,Log4Net实现了很多侦听器,但是我需要所有这些吗?在大多数情况下不是。如果我需要一个特殊的侦听器,实现自己的侦听器并不难,不是吗?例如,我需要一个侦听器来跟踪数据库(不仅是消息,而且还要同时包含不同的信息(字符串,整数等)。

我说的对吗


实际上,我相信您(至少在TraceSource方面)
马克

3

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

这种灵活性使我可以为一个子系统配置详细的日志记录,而无需打开整个系统的防火墙。

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

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


12
回复:目标-TraceSource提供了这一点。您可以配置多个TraceSource,并分别进行调整。
Paul Stovell,09年

1
回复:性能。如果仍然如此,我会感到惊讶,但这肯定是我将要调查的事情。人们如何应对每秒读取一千条日志消息?:)
Paul Stovell

1
我知道速读课程会派上用场
stimms

归结为跟踪和日志记录之间的模糊灰线-重大事件的日志记录与流程细节的跟踪。有时,诊断生产系统问题的唯一方法是使用放大镜查找非常详细的日志。
Bevan

4
Bevan-有关TraceSource(它支持多个子系统)的问题,而不是Trace上的静态方法。此外,为了提高性能,还与Logging Application Block(来自EntLib)进行了比较,这又是另一回事。log4net和TraceSource的速度非常可比(但是,是的,EntLib / LAB速度很慢,因此为什么我更喜欢TraceSource)。
Sly Gryphon

0

尽管Im仅了解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


请参阅Codeplex上的Essential Diagnostics项目(essentialdiagnostics.codeplex.com),以获取具有模式/格式支持的System.Diagnostics TraceListener以及TraceSource的界面和外观(尽管您可以通过附加测试跟踪侦听器进行测试)。
狡猾的狮
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.