如何使用NLog提高特定库的最低日志级别?

时间:2015-08-11 09:17:02

标签: memcached servicestack nlog enyim.caching

我正在使用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吗?

1 个答案:

答案 0 :(得分:1)

看起来这是通配符的问题。我在${logger}的{​​{1}}属性中添加了target,以查看生成Memcached日志的确切记录器名称。事实证明,有很多。主要的一个叫做layout,但还有Enyim.Caching.Memcached.MemcachedNode.InternalPoolImplTextSocketHelper(这些都没有命名空间)。

所以添加这些规则是有效的:

GetHelper

这看起来不太正确,能告诉Enyim.Memcached不记录这些内容会更好。

如果记录器的<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" /> 高于&#34; Debug&#34;,则记录器对象的minlevel属性将为IsDebugEnabled。因此,此配置更改将阻止Enyim.Memcached库中的日志记录调用。