Не може да се филтрира по име на клас (в NLog.config), когато се използва anotar catel nlog logging

Използвам anotar catel fody за влизане в моето приложение.

В NLog.config искам да използвам различни нива за определени класове. Примерна конфигурация

<logger name="SpaceA.*"
        minlevel="Info"
        writeTo="file"
        final="true" />
<logger name="*"
        minlevel="Debug"
        writeTo="file" />

Създадох клас NLogListener, който произлиза от LogListenerBase на catel.

public class NLogListener : LogListenerBase
{
    private static readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger();

    protected override void Debug(ILog log, string message, object extraData)
    {
        Log.Debug(message);
    }

    protected override void Info(ILog log, string message, object extraData)
    {
        Log.Info(message);
    }

    protected override void Warning(ILog log, string message, object extraData)
    {
        Log.Warn(message);
    }

    protected override void Error(ILog log, string message, object extraData)
    {
        Log.Error(message);
    }
    #endregion Methods
}

В моя код използвам Catel Anotar Fody:

LogTo.Debug("Starting something...");

Сега, независимо къде използвам регистрирането, всичко се показва като идващо от пространството на имената, където съм дефинирал LogListerer.

Какво правя погрешно и следователно трябва ли да променя, за да мога да филтрирам NLog по имена на класове, както обикновено?


person dromer1967    schedule 25.01.2014    source източник


Отговори (1)


Проблемът е, че получавате текущия регистър на класове в LogListener:

private static readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger();

По този начин винаги влизате в типа NLogListener. Това, което трябва да направите, е да получите правилния тип регистратор за всеки запис:

protected override void Debug(ILog log, string message, object extraData)
{
    var nlog = NLog.LogManager.GetClassLogger(log.TargetType);
    nlog.Debug(message);
}
person Geert van Horrik    schedule 26.01.2014
comment
Благодаря Geert, това има смисъл :) Когато правя това обаче, се натъквам на следната грешка при извикване на NLog.LogManager.GetCurrentClassLogger(log.TargetType): Не мога да осъществя достъп до конструктора от тип: VES.Framework.AppDomainExtensions. Предоставено ли е необходимото разрешение? Това изглежда се случва, ако имам извиквания на съобщения в журнал в статичен клас. Някакви идеи за това? - person dromer1967; 26.01.2014
comment
Добре, промяната на извикването на GetLogger(log.TargetType.ToString()) свърши работа :) - person dromer1967; 26.01.2014