如何使用 NLog 提高特定库的最低日志级别?
How to raise the minimum log level for specific libraries with NLog?
我将 ServiceStack 与 Enyim.Memcached 和 NLog 一起使用。我的 NLog 配置如下所示:
<nlog internalLogFile="C:\LogFiles\nlog.log" internalLogLevel="Warn">
<targets>
<target name="asyncLogFile" type="AsyncWrapper" queueLimit="5000" overflowAction="Discard">
<target name="logFile" type="File" fileName="C:\LogFiles\application.log" layout="${date}|${level:uppercase=true}|${callsite}|${message}" />
</target>
</targets>
<rules>
<logger name="*" minlevel="Debug" writeTo="asyncLogFile" />
</rules>
</nlog>
一切顺利。但是,Memcached 在日志文件中写入了很多我不想要的诊断信息,例如:
2015/08/11 09:59:29.317|DEBUG|Enyim.Caching.Memcached.Protocol.Text.TextSocketHelper.ReadLine|ReadLine: END
我试过在当前规则之上添加这条规则,但这没有效果:
<logger name="*Memcached*" minlevel="Warn" writeTo="asyncLogFile" final="true" />
我只想从具有警告级别或更高级别的 Memcached 写入日志消息。我究竟做错了什么?此外,Enyim.Memcached 代码会在尝试写入日志之前检查 log.IsDebugEnabled
。如果可以改变我的配置来做我想做的事,这会导致 属性 变成 false
吗?
看起来是通配符的问题。我将 ${logger}
添加到 target
的 layout
属性以查看生成 Memcached 日志的确切记录器名称。原来有不少。主要的一个称为 Enyim.Caching.Memcached.MemcachedNode.InternalPoolImpl
,但还有 TextSocketHelper
和 GetHelper
(这些上没有名称空间)。
所以添加这些规则有效:
<logger name="Enyim.Caching.*" minlevel="Warn" writeTo="asyncLogFile" final="true" />
<logger name="TextSocketHelper" minlevel="Warn" writeTo="asyncLogFile" final="true" />
<logger name="GetHelper" minlevel="Warn" writeTo="asyncLogFile" final="true" />
这似乎不太正确,如果能够告诉 Enyim.Memcached 不要记录这些东西会更好。
如果记录器的 minlevel
高于 "Debug",则记录器对象的 IsDebugEnabled
属性 将为 false
。因此,此配置更改将阻止 Enyim.Memcached 库中的日志记录调用。
我将 ServiceStack 与 Enyim.Memcached 和 NLog 一起使用。我的 NLog 配置如下所示:
<nlog internalLogFile="C:\LogFiles\nlog.log" internalLogLevel="Warn">
<targets>
<target name="asyncLogFile" type="AsyncWrapper" queueLimit="5000" overflowAction="Discard">
<target name="logFile" type="File" fileName="C:\LogFiles\application.log" layout="${date}|${level:uppercase=true}|${callsite}|${message}" />
</target>
</targets>
<rules>
<logger name="*" minlevel="Debug" writeTo="asyncLogFile" />
</rules>
</nlog>
一切顺利。但是,Memcached 在日志文件中写入了很多我不想要的诊断信息,例如:
2015/08/11 09:59:29.317|DEBUG|Enyim.Caching.Memcached.Protocol.Text.TextSocketHelper.ReadLine|ReadLine: END
我试过在当前规则之上添加这条规则,但这没有效果:
<logger name="*Memcached*" minlevel="Warn" writeTo="asyncLogFile" final="true" />
我只想从具有警告级别或更高级别的 Memcached 写入日志消息。我究竟做错了什么?此外,Enyim.Memcached 代码会在尝试写入日志之前检查 log.IsDebugEnabled
。如果可以改变我的配置来做我想做的事,这会导致 属性 变成 false
吗?
看起来是通配符的问题。我将 ${logger}
添加到 target
的 layout
属性以查看生成 Memcached 日志的确切记录器名称。原来有不少。主要的一个称为 Enyim.Caching.Memcached.MemcachedNode.InternalPoolImpl
,但还有 TextSocketHelper
和 GetHelper
(这些上没有名称空间)。
所以添加这些规则有效:
<logger name="Enyim.Caching.*" minlevel="Warn" writeTo="asyncLogFile" final="true" />
<logger name="TextSocketHelper" minlevel="Warn" writeTo="asyncLogFile" final="true" />
<logger name="GetHelper" minlevel="Warn" writeTo="asyncLogFile" final="true" />
这似乎不太正确,如果能够告诉 Enyim.Memcached 不要记录这些东西会更好。
如果记录器的 minlevel
高于 "Debug",则记录器对象的 IsDebugEnabled
属性 将为 false
。因此,此配置更改将阻止 Enyim.Memcached 库中的日志记录调用。