2014-01-25 1 views
1

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

В NLog.config Я хочу использовать разные уровни для определенных классов. Пример 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 
} 

В моем коде я использую Катель анотара Fody:

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

Теперь независимо от того, где я использую вырубку, все это отображается как исходящий из пространства имен, где я определил LogListerer.

Что я делаю неправильно и ergo, я должен изменить, чтобы иметь возможность фильтровать NLog в именах классов, как это обычно должно быть?

ответ

2

Проблема заключается в том, что вы получите текущий регистратор класса в 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); 
} 
+0

Спасибо Geert, что имеет смысл :) Однако, когда я делаю это я бегу в следующее сообщение об ошибке при вызове NLog.LogManager.GetCurrentClassLogger (журнал .TargetType): «Невозможно получить доступ к конструктору типа: VES.Framework.AppDomainExtensions. Разрешено ли разрешение?» Это происходит, если у меня есть вызовы сообщений журнала в статическом классе. Любые идеи по этому поводу? – dromer1967

+1

Хорошо, изменив вызов GetLogger (log.TargetType.ToString()) сделал трюк :) – dromer1967