log4net与TraceSource

在这个线程中,很多人都表示使用了log4net。 我是TraceSources的粉丝,想知道为什么使用log4net。

这就是为什么我喜欢追踪来源:

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

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

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

我认为log4net正在为你列出的每一个。

可插入的监听器听起来像appender – 有很多,实际上我甚至黑客滚动的日志文件总是以.log文件关联(为文件关联),添加cc字段的电子邮件appender,并最终调整我最喜欢的值彩色的控制台appender。 如果我可以如此大胆 – 我的彩色主机的幸福:

<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只有严重错误警告信息debugging按照逐渐增加的顺序。 我真正想念的唯一一个是对谁做了什么日志logging的审计。

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

  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:对不起,跳过那个 – 我会听你的。

活动/范围的相关性:是否像每个文件(读取类)一样获取它自己的具有单独日志级别阈值的命名日志。 事实上,即使在一个class级中,你也可以对日志进行细分(事实上,这可能已经变得太多了)

在一个类文件中:

  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中configuration:或许在ASP.NET中这是一件好事,我不知道,但是在制作富客户端bean计数应用程序时,我喜欢单独的configuration文件。

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

– 麦克

在.NET Framework的早期(.NET 1.0)跟踪相当有限。

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

log4j在Java中很受欢迎,因此得到了对.NET端口的大量支持,一旦它变得stream行起来,它就会保持这种状态,尽pipe人们甚至没有正确地使用它(例如,将它封装在一个单例logging器中并丢失这是主要特点)。

不过,我认为log4net和其他框架(例如NLog,Common.Logging,甚至EntLib)通过从头开始实现自己的日志logging系统错误的方式,即改变你写日志语句的方式。

我更希望看到努力,特别是自.NET 2.0以来,已经扩展了已经在.NET中的基础。 对于那些确实已经存在的项目,请参考CodePlex上的Essential Diagnostics项目( http://essentialdiagnostics.codeplex.com/ )。

log4net的一些优点:

  • 它类似于log4j,如果你运行一个混合的环境,并希望一致的日志logging。

  • 自动logging器层次结构inheritance设置是相当整洁的,相比你实现了多less个跟踪源,并且必须configuration每个。 (尽pipe在某些情况下可能是矫枉过正)。

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

缺点(与System.Diagnostics相比):

  • 您需要使用不同的日志logging语法,所以如果您已经使用source.TraceEvent(),则需要经过并replace所有内容。

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

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

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

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

使用TraceSources而不是Log4Net的另一个原因是跟踪本身:Log4Net只能用于logging(消息),但是如何跟踪一个对象(同时有多个信息)? 当然Log4Net有很多Listeners的实现,但是我需要所有这些吗? 大多数情况下不。 如果我需要一个特别的倾听者,那么执行我自己的一个并不难,不是吗? 例如,我需要一个监听器跟踪到一个数据库(不仅是消息,但不同的信息{string,int的等})。

我是对的吗?

之所以selectLog4Net,是因为使用了Log4Net的跟踪function,我可以独立地对我的应用程序(数据访问,服务,业务逻辑等)和不同子系统(身份validation,处理等)的不同层次进行testing,closures每个子系统的logging。

这种灵活性使我可以为一个子系统configuration详细的日志logging,而无需打开整个系统的stream水线。

Trace类[如TraceInformation()]上提供的静态方法不提供任何方法来指定日志logging来自哪个子系统,所以这不是通过编写我自己的TraceListener轻松提供的。

另一个原因是性能 – 我的应用程序有可能每秒钟logging几千条消息。 Log4Net的开销很低。 相比之下,我上次查看它时,日志logging应用程序块重新logging了每个logging的消息的XMLconfiguration,使得块非常繁重和缓慢。

虽然我只知道log4net的工作方式,但是使用这个框架的一个明显的好处是对于那些习惯于使用log4j的人来说是非常熟悉的。

另一个小好处是,使用log4net进行testing驱动日志logging非常简单; logging器实现log4net.ILog。 再次我不熟悉微软的解决scheme,但我想知道如果没有首先写一个门面到System.Diagnostics.Trace类如何做到这一点。

粗略看一下跟踪源文档,我找不到与布局等价的东西,并且很想知道这样的等价物是否存在。 PatternLayout格式化日志条目是非常方便的,如date戳,线程信息,日志上下文等常用数据。Log4net PatternLayout文档: http ://logging.apache.org/log4net/release/sdk/log4net.Layout.PatternLayout.html

另外,鉴于将日志框架扩展写入日志框架可能是一个经典的“元问题”,log4net确实为表格带来了一个可插入的侦听器等价物列表。

appenders列表: http : //logging.apache.org/log4net/release/config-examples.html