Невозможно отфильтровать имя класса (в NLog.config) при использовании журнала anotar catel nlog.

Я использую anotar catel fody для входа в свое приложение.

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

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

Я создал класс NLogListener, производный от Catel LogListenerBase.

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
Спасибо, Герт, это имеет смысл :) Однако, когда я это делаю, я сталкиваюсь со следующей ошибкой при вызове NLog.LogManager.GetCurrentClassLogger(log.TargetType): Не удается получить доступ к конструктору типа: VES.Framework.AppDomainExtensions. Дано ли необходимое разрешение? Кажется, это происходит, если у меня есть вызовы сообщений журнала в статическом классе. Любые идеи по этому поводу? - person dromer1967; 26.01.2014
comment
Хорошо, изменение вызова GetLogger(log.TargetType.ToString()) помогло :) - person dromer1967; 26.01.2014