在this thread中,许多人表示他们使用log4net。我是TraceSources的粉丝,想知道为什么使用log4net。
这就是我喜欢跟踪源的原因:
由于.NET框架在内部使用TraceSources,它也为我提供了一种配置跟踪的一致方法 - 使用log4net,我必须配置log4net以及TraceSources。
log4net给我的TraceSources没有(或者通过编写几个自定义TraceListener无法完成)?
答案 0 :(得分:56)
在早期(.NET 1.0)中,.NET Framework中的跟踪非常有限。
例如,TraceSource分区直到.NET 2.0才出现,你只有四个级别(错误,警告,信息,详细),但你可以使用六个布尔开关进行分区。
log4j在Java中非常流行,因此得到了很多.NET端口的支持,一旦它变得流行,它就会保持这种状态,即使人们甚至没有正确使用它(例如将它包装成单例)记录器并失去它的主要特征)。
尽管如此,我认为log4net和其他框架(例如NLog,Common.Logging,甚至是EntLib)通过从头开始实现自己的日志系统而走错了方向,即改变你在日志中编写日志语句的方式。第一名。
我更倾向于看到努力,尤其是自.NET 2.0以来,努力扩展.NET已有的基础。对于确实扩展已有内容的项目,请查看CodePlex上的Essential Diagnostics项目(http://essentialdiagnostics.codeplex.com/)。
log4net的一些优势:
如果您运行混合环境并希望记录一致,则类似于log4j。
与您实施的必须配置的跟踪源数量相比,继承设置的自动记录器层次结构非常简洁。 (虽然在某些情况下可能有点过分)。
log4net已经有大约28个appender(相当于跟踪侦听器),而System.Diagnostics只有10个(但是请参阅Essential.Diagnostics项目了解更多),所以如果你真的认为你可能需要RemoteSyslogAppender,NetSendAppender ,AnsiColorTerminalAppender或TelnetAppender,那么你很幸运。
缺点(与System.Diagnostics相比):
您需要使用不同的日志记录语法,因此如果您已经在使用source.TraceEvent(),则需要通过并替换所有内容。
这也扩展到不同的关联语法,因此您需要从CorrelationManager更改为log4net上下文。
不容易与Framework跟踪集成(例如WCF)。
对事件ID的支持不足(需要使用单独的扩展项目IEventLog)。
尚不支持Windows(Vista)事件跟踪或服务跟踪查看器XML格式。
答案 1 :(得分:9)
我认为log4net正在为您列出的所有内容。
可插入的侦听器听起来像是appender - 它们有很多,实际上我甚至还将滚动的日志文件整理成.log(用于文件关联),在电子邮件appender中添加了一个cc字段,并最终调整了我的彩色控制台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仅随着详细程度的增加而附带致命错误警告信息调试。我唯一真正想念的是审核谁做了什么记录。
可自定义配置:我使用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
只是一大堆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, -Mike
答案 2 :(得分:4)
使用TraceSources代替Log4Net的另一个原因是跟踪自身: Log4Net只能用于记录(消息)但是如何跟踪对象(同时有多个信息)? 当然Log4Net实现了很多监听器,但是我需要所有这些吗? 在大多数情况下没有。 如果我需要一个特殊的倾听者,那么实现我自己的那个并不困难,不是吗? 例如,我需要一个监听器来跟踪一个数据库(不仅是消息,而且还有不同的信息{string's,int's等}}。
我是对的吗?
答案 3 :(得分:3)
我更喜欢Log4Net使用Trace-target作为目标 - 使用Log4Net,我可以独立地检测我的应用程序的不同层(数据访问,服务,业务逻辑等)和不同的子系统(身份验证,处理等)和打开/关闭每个子系统的记录。
这种灵活性允许我为一个子系统配置详细的日志记录,而无需打开整个系统的firehose。
Trace类提供的静态方法[如TraceInformation()]没有提供任何方法来指定日志记录来自哪个子系统,所以这不是通过编写我自己的TraceListener轻松提供的。
另一个原因是性能 - 我的应用程序中有一部分可能每秒记录数千条消息。 Log4Net的开销很低。相比之下,上次我查看它时,Logging Application块为每个记录的消息重新分配了它的XML配置,使得块非常繁重和缓慢。
答案 4 :(得分:0)
虽然我只知道log4net的工作方式,但使用该框架的一个明显的好处是对那些习惯使用log4j的人很熟悉。
另一个小好处是使用log4net进行测试驾驶记录非常简单;记录器实现log4net.ILog。我再也不熟悉微软的解决方案,但我想知道如果没有先写一个Facade到System.Diagnostics.Trace类就可以做到这一点。
粗略地查看跟踪源文档,我找不到与布局等效的内容,并且有兴趣知道是否存在这样的等价物。 PatternLayout非常便于使用常见数据(如日期戳,线程信息,日志上下文等)格式化日志条目.Log4net PatternLayout docs:http://logging.apache.org/log4net/release/sdk/log4net.Layout.PatternLayout.html
此外,鉴于编写日志框架的扩展可能是一个经典的“元问题”,log4net确实为表提供了一个可插入的侦听器等效的宏列表。
追加者列表:http://logging.apache.org/log4net/release/config-examples.html