log4net 与 TraceSource [关闭]
Posted
技术标签:
【中文标题】log4net 与 TraceSource [关闭]【英文标题】:log4net versus TraceSource [closed] 【发布时间】:2010-10-09 06:05:33 【问题描述】:在this thread 很多人表示他们使用log4net。我是 TraceSources 的粉丝,想知道为什么要使用 log4net。
这就是我喜欢跟踪源的原因:
可插入的侦听器 - XML、TextFile、Console、EventLog,自己动手 可自定义的跟踪开关(错误、警告、信息、详细、开始、结束、自定义) 可自定义配置 日志记录应用程序块只是一大组 TraceListeners 活动/范围的相关性(例如,将 ASP.NET 请求中的所有日志与给定客户相关联 服务跟踪查看器允许您针对这些活动单独可视化事件 所有这些都可以在 app.config/web.config 中进行配置。由于 .NET 框架内部使用 TraceSources,它还为我提供了一种配置跟踪的一致方式 - 使用 log4net,我必须配置 log4net 以及 TraceSources。
log4net 给了我什么 TraceSources 没有(或者无法通过编写几个自定义 TraceListeners 来完成)?
【问题讨论】:
我发现这个问题值得 SO,并且还发现几个答案足够丰富,我不再需要搜索更多信息。无论谁以“不具建设性”的态度结束了这个问题,我质疑它是否是因为对 log4net 的偏见以及对收到的一系列答案普遍不满意而完成的。这个问题和许多答案有助于澄清围绕 log4net 和 .NET Tracing 的恐惧、不确定性、怀疑和明显的错误信息。 我也发现这个问题很有帮助。事实上,这完全符合我的要求。 【参考方案1】:我更喜欢使用 Log4Net 而不是使用 Trace one 的原因 - 使用 Log4Net,我可以独立地检测我的应用程序的不同层(数据访问、服务、业务逻辑等)和不同的子系统(身份验证、处理等)和独立打开/关闭每个子系统的日志记录。
这种灵活性允许我为一个子系统配置详细的日志记录,而无需打开整个系统的消防软管。
Trace 类上提供的静态方法 [例如 TraceInformation()] 没有提供任何方式来指定日志记录来自哪个子系统,所以这不是通过编写我自己的 TraceListener 来轻松提供的。
另一个原因是性能 - 我的应用程序可能每秒记录数千条消息。 Log4Net 的开销很低。相比之下,上次我查看它时,日志应用程序块为记录的每条消息重新解析其 XML 配置,这使得该块非常沉重和缓慢。
【讨论】:
Re:定位 - TraceSource 提供了这个。您可以配置多个 TraceSource 并单独调整每个。 回复:性能。如果情况仍然如此,我会感到惊讶,但这肯定是我会调查的事情。人们如何应对每秒阅读一千条日志消息? :) 我知道速读课程会派上用场 归结为跟踪和日志记录之间的模糊灰线 - 记录主要事件与跟踪流程细节。有时,诊断生产系统问题的唯一方法是使用放大镜跟踪非常详细的日志。 Bevan - 关于 TraceSource(支持多个子系统)而不是 Trace 上的静态方法的问题。同样为了性能,您与 Logging Application Block(来自 EntLib)进行了比较,这又是另一回事。 log4net 和 TraceSource 的速度非常相似(但是是的,EntLib/LAB 很慢,因此我更喜欢 TraceSource)。【参考方案2】:我认为 log4net 正在为我做你列出的所有事情。
Pluggable listeners 听起来像 appender - 它们有很多,实际上我什至将滚动日志文件破解为始终以 .log 结尾(用于文件关联),在电子邮件 appender 中添加了一个 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 [%propertyNDC] - %message%newline" />-->
<!--<conversionPattern value="%-5level %file:%line - %message%newline" />-->
<conversionPattern value="%level %logger:%line %newline %message%newline" />
</layout>
可自定义的跟踪开关:Log4net 仅附带 FATAL ERROR WARN INFO DEBUG 以增加详细程度。我唯一真正想念的是 AUDIT for who-did-what 日志记录。
可自定义的配置:我使用在运行时加载的 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 和元数据关联起来——从那里直到上下文“关闭”的所有跟踪都与该上下文相关。例如,可以轻松查看与特定订单或客户相关的所有日志 相比之下,每个客户/订单有不同的日志文件可能会很烦人 上下文也支持嵌套,尽管我还没有尝试过 Mike,您几乎确认 log4net 完成了已内置到 .NET Framework 中 TraceSource 中的所有操作。问题是“log4net 给了我什么 TraceSources 没有?”,即除了普通的 .NET,log4net 还提供了哪些额外的东西。 来源?我已经调整了几件事。 ...但我并不是想卖给任何人,只是说我让 X 工作得很好,但这并没有削弱 Y【参考方案3】:虽然我只知道 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 的接口和外观(尽管您可以通过简单地附加一个测试跟踪监听器)。【参考方案4】:在早期 (.NET 1.0) 中,.NET Framework 中的跟踪非常有限。
例如,直到 .NET 2.0 才出现 TraceSource 分区,并且您只有四个级别(错误、警告、信息、详细),但如果您愿意,可以使用六个布尔开关进行分区。
log4j 在 Java 中很流行,因此得到了对 .NET 端口的大量支持,一旦它流行起来,它就一直保持这种状态,即使人们甚至没有正确使用它(例如,将它包装在一个单例中) logger 并失去它的主要功能)。
不过,我认为 log4net 和其他框架(例如 NLog、Common.Logging 甚至 EntLib)从一开始就实现了自己的日志系统,甚至改变了您在第一名。
我更希望看到努力,尤其是从 .NET 2.0 开始,将其用于扩展 .NET 中已有内容的坚实基础。对于确实扩展现有内容的项目,请查看 CodePlex (http://essentialdiagnostics.codeplex.com/) 上的 Essential Diagnostics 项目。
log4net 的一些优势:
它类似于 log4j,如果您运行混合环境并想要一致的日志记录。
与您实现并且必须配置每个跟踪源的数量相比,继承设置的自动记录器层次结构非常简洁。 (尽管在某些情况下可能会矫枉过正)。
log4net 已经有大约 28 个附加程序(相当于跟踪侦听器),而 System.Diagnostics 只有 10 个(但请参阅 Essential.Diagnostics 项目了解更多信息),所以如果你真的认为你可能需要 RemoteSyslogAppender,NetSendAppender ,AnsiColorTerminalAppender 或 TelnetAppender,那么你很幸运。
缺点(与 System.Diagnostics 相比):
您需要使用不同的日志记录语法,所以如果您已经在使用 source.TraceEvent(),则需要遍历并替换所有内容。
这还扩展到不同的关联语法,因此您需要从 CorrelationManager 更改为 log4net 上下文。
不容易与框架跟踪(例如 WCF)集成。
对事件 ID 的支持不佳(需要使用单独的扩展项目 IEventLog)。
尚不支持 Windows 事件跟踪 (Vista) 或服务跟踪查看器 XML 格式。
【讨论】:
【参考方案5】:使用 TraceSources 而不是 Log4Net 的另一个原因是 Tracing 本身: Log4Net 只能用于 Logging(消息)但是如何跟踪一个对象(同时多个信息)? 当然 Log4Net 实现了很多 Listeners,但我需要所有这些吗? 在大多数情况下不是。 如果我需要一个特殊的监听器,实现我自己的监听器并不难,不是吗? 例如,我需要一个侦听器来跟踪数据库(不仅是消息,还有不同的信息 string's, int's, etc. 同时)。
我是对的吗?
【讨论】:
确实我相信你是(至少在 TraceSource 方面)以上是关于log4net 与 TraceSource [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
.Net:如何抑制 TraceSource 标头(“SourceName TraceEventType:Id:”)?
System.Diagnostics.TraceSource 未将数据发送到 Application Insights
csharp .NET文件,用于显示如何使用和配置TraceSource进行日志记录。
AWS Lambda、.Net Core 和 MySql:无法加载文件或程序集 'System.Diagnostics.TraceSource,版本 = 4.0.0.0