.net log4net与TraceSource
在许多情况下,有人表示他们使用log4net。我是TraceSources的粉丝,想知道为什么使用log4net 以下是我喜欢跟踪源的原因:.net log4net与TraceSource,.net,logging,log4net,trace,diagnostics,.net,Logging,Log4net,Trace,Diagnostics,在许多情况下,有人表示他们使用log4net。我是TraceSources的粉丝,想知道为什么使用log4net 以下是我喜欢跟踪源的原因: 可插入监听器-XML、文本文件、控制台、事件日志、滚动您自己的 可自定义跟踪开关(错误、警告、信息、详细、开始、结束、自定义) 可定制配置 日志应用程序块只是一大组TraceListener 活动/范围的关联(例如,将ASP.NET请求中的所有日志与给定客户关联 “服务跟踪查看器”允许您分别对这些活动的事件进行可视化 所有这些都可以在app.config
- 可插入监听器-XML、文本文件、控制台、事件日志、滚动您自己的
- 可自定义跟踪开关(错误、警告、信息、详细、开始、结束、自定义)
- 可定制配置
- 日志应用程序块只是一大组TraceListener
- 活动/范围的关联(例如,将ASP.NET请求中的所有日志与给定客户关联
- “服务跟踪查看器”允许您分别对这些活动的事件进行可视化
- 所有这些都可以在app.config/web.config中配置
log4net给了我什么TraceSources没有的(或者写几个定制的TraceListener无法做到的)?我更喜欢log4net而不是使用目标跟踪之一的原因-有了log4net,我可以独立地为我的应用程序的不同层(数据访问、服务、业务逻辑等)和不同的子系统安装仪器(认证、处理等)并独立打开/关闭每个子系统的日志记录 这种灵活性允许我为一个子系统配置详细的日志记录,而无需打开整个系统的消防软管 Trace类上提供的静态方法[例如TraceInformation()]没有提供任何方法来指定日志记录来自哪个子系统,因此编写自己的TraceListener并不容易做到这一点
另一个原因是性能-我的应用程序中有一部分每秒可能记录数千条消息。Log4Net的开销很低。相比之下,上次我查看它时,日志应用程序块为记录的每条消息重新解析了其XML配置,这使得该块非常沉重和缓慢。我认为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>
只是一大套TraceListener:很抱歉跳过了这一套——我相信你的话
活动/范围的相关性:你是说像每个文件(读取类)都有自己的命名日志,可以有单独的日志级别阈值。事实上,你甚至可以在单个类中分割日志(事实上,可能已经发展到做太多了…)
在类文件中:
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计数应用程序时,我喜欢一个单独的配置文件
这里的一切都是我自己的小技巧
嗯,,
-Mike虽然我只知道log4net的工作方式,但使用该框架的一个明显好处是,对于那些习惯使用log4j的人来说,可以立即熟悉它 另一个小小的好处是,使用log4net进行测试驱动日志记录非常简单;日志记录器实现log4net.ILog。同样,我不熟悉Microsoft解决方案,但我想知道,如果不先为System.Diagnostics.Trace类编写外观,如何做到这一点 粗略地看一下跟踪源文档,我找不到与layouts等效的文件,我想知道是否存在此类等效文件。PatternLayout非常方便地使用诸如日期戳、线程信息、日志上下文等常用数据格式化日志条目。Log4net PatternLayout文档: 此外,考虑到为日志框架编写扩展可能是一个典型的“元问题”,log4net确实为表中提供了大量可插入侦听器等价物 附录列表:在早期(.NET 1.0)在.NET Framework中的跟踪非常有限 例如,TraceSource分区直到.NET2.0才出现,您只有四个级别(错误、警告、信息、详细),但如果需要,您可以使用六个布尔开关进行分区 log4j在Java中很流行,因此得到了很多对.NET端口的支持,一旦它流行起来,它就一直保持这种状态,尽管人们甚至没有正确地使用它(例如,将它包装在单例记录器中,并失去了它的主要功能) 尽管如此,我认为log4net和其他框架(例如NLog、Common.Logging,甚至EntLib)从一开始就实现了自己的日志系统,这是错误的,也就是说,甚至改变了您编写日志语句的方式 我更希望看到扩展.NET中已有内容的坚实基础所付出的努力,尤其是.NET 2.0以来。对于扩展现有内容的项目,请查看CodePlex()上的Essential Diagnostics项目 log4net的一些优势:
- 如果您运行一个混合环境并希望日志记录一致,那么它与log4j类似
- 继承设置的自动记录器层次结构非常整洁,相比之下,您实现了多少跟踪源,并且必须对每个跟踪源进行配置(尽管在某些情况下可能会过度杀戮)
- log4net已经有大约28个Appender(相当于跟踪侦听器),而System.Diagnostics只有10个(但更多信息请参见Essential.Diagnostics项目),因此如果您确实认为可能需要RemoteSyslogAppender、NetSendAppender、AnsiColorTerminalAppender或TelnetAppender,那么您就很幸运了
<logger name="NipissingU.ADWrapper.EntryTools.Attribute">
<level value="INFO" />
</logger>
<logger name="NipissingU.ADWrapper.EntryTools.Cache">
<level value="WARN" />
</logger>