Как повысить минимальный уровень журнала для определенных библиотек с 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?

1 ответ

Решение

Похоже, это была проблема с подстановочным знаком. я добавил ${logger} к target"s 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 для регистратора выше, чем "Отладка", то IsDebugEnabled свойство объекта регистратора будет false, Таким образом, это изменение конфигурации предотвратит регистрацию вызовов в библиотеке Enyim.Memcached.

Другие вопросы по тегам