2016-10-27 7 views
0

私はカスタムロガーを呼び出すためにCommon.Loggingを取得しようとしていますが、WriteInternalは呼び出されません。私はどこかの構成を見逃しましたか?私のASP.NET Owinプロジェクトでは、Startup.csはILoggerですが、私のカスタムロガーですWriteInternalはCommon.Loggingで呼び出されていませんAbstractLogger派生語

 LogManager.Adapter = new HubLoggerAdapter(resolver.Kernel.Get<ILogger>()); 

を持っています。 HubLoggerAdapterは

public class HubLoggerAdapter : ILoggerFactoryAdapter 
{ 
    private ILogger _logger; 

    public HubLoggerAdapter(ILogger logger) 
    { 
     _logger = logger; 
    } 

    public ILog GetLogger(Type type) 
    { 
     if (type == null) 
     { 
      throw new ArgumentNullException("type"); 
     } 

     try 
     { 
      return new HubLogger(_logger); 
     } 
     catch (Exception ex) 
     { 
      var x = ex.Message; 
     } 
     return null; 
    } 

    public ILog GetLogger(string name) 
    { 
     if (name == null) 
     { 
      throw new ArgumentNullException(); 
     } 

     try 
     { 
      return new HubLogger(_logger); 
     } 
     catch (Exception ex) 
     { 
      var x = ex.Message; 
     } 
     return null; 
    } 
} 

のように見えると私は VARロガー= LogManager.GetLogger()を呼び出した場合、ロガーは

public class HubLogger : AbstractLogger 
{ 
    public override bool IsTraceEnabled { get { return _logLevel.HasFlag(LogLevel.Trace); } } 
    public override bool IsDebugEnabled { get { return _logLevel.HasFlag(LogLevel.Debug); } } 
    public override bool IsErrorEnabled { get { return _logLevel.HasFlag(LogLevel.Error); } } 
    public override bool IsFatalEnabled { get { return _logLevel.HasFlag(LogLevel.Fatal); } } 
    public override bool IsInfoEnabled { get { return _logLevel.HasFlag(LogLevel.Info); } } 
    public override bool IsWarnEnabled { get { return _logLevel.HasFlag(LogLevel.Warn); } } 

    private LogLevel _logLevel; 
    private ILogger _logger; 

    public HubLogger(ILogger logger) 
     : this(logger, LogLevel.All) 
    { 

    } 

    public HubLogger(ILogger logger, LogLevel level) 
     : base() 
    {    
     _logLevel = level; 
     _logger = logger; 

     _logger.Log("initiating HubLogger"); 
    } 

    protected override void WriteInternal(LogLevel level, object message, Exception exception) 
    { 
     switch (level) 
     { 
      case LogLevel.All: 
      case LogLevel.Trace: 
      case LogLevel.Debug: 
      case LogLevel.Info: 
      case LogLevel.Warn: 
      case LogLevel.Error: 
       _logger.Log(message.ToString()); 
       if (exception != null) 
       { 
        _logger.Log(exception); 
       } 
       break; 
      case LogLevel.Off: 
       break; 

      default: 
       throw new ArgumentOutOfRangeException("level", level, "invalid logging level"); 
     } 
    } 
} 

のように見えます。 logger.Warn( "私は生きています。");

「HubLoggerを開始します」が表示されますが、WriteInternalは自分のメッセージに対して呼び出されません。それは本当に奇妙です。どんな洞察も高く評価されました。

編集1.提案ごとにNameValueCollectionを使用してコンストラクタを追加しようとしましたが、機能しませんでした。具体的には、

private ILogger _logger; 
    public IKernel Kernel { get; set; } 

    public HubLoggerAdapter(NameValueCollection props) 
    { 

// _logger = props ["logger"]; }

public HubLoggerAdapter(ILogger logger) 
    { 
     _logger = logger; 
    } 

とは

 var props = new NameValueCollection(); 
     var adapter = new HubLoggerAdapter(props); 
     adapter.Kernel = resolver.Kernel; 
     LogManager.Adapter = adapter; 

コンストラクタは、任意の違いになるだろう、なぜわからない

を使用しました。

+1

http://netcommon.sourceforge.net/docs/1.2.0/reference/html/logging.html:1.5.1:「重要:任意の実装が提供しなければなりませんNameValueCollectionパラメータを受け入れるパブリックコンストラクタ " – Caramiriel

+0

私はそこに自分のオブジェクトをどのように渡すことができるのだろうか。 – tofutim

+0

それは本当に奇妙なものでもありません。私はあなたの提案を試みたが、それは役に立たなかった – tofutim

答えて

0

私はついにこれをAbstractSimpleLoggerとAbstractSimpleLoggerFactoryAdapterから派生させることで動作させました。

public class HubLogger : AbstractSimpleLogger 
{ 
    private ILogger _logger; 

    public HubLogger(ILogger logger, string logName, LogLevel logLevel, bool showLevel, bool showDateTime, bool showLogName, string dateTimeFormat) 
     : base(logName, logLevel, showLevel, showDateTime, showLogName, dateTimeFormat) 
    { 
     _logger = logger; 
    } 

    protected override void WriteInternal(LogLevel level, object message, Exception e) 
    { 
     switch (level) 
     { 
      case LogLevel.All: 
      case LogLevel.Trace: 
      case LogLevel.Debug: 
      case LogLevel.Info: 
      case LogLevel.Warn: 
      case LogLevel.Error: 
       // Use a StringBuilder for better performance 
       StringBuilder sb = new StringBuilder(); 
       FormatOutput(sb, level, message, e); 

       if (e != null) 
       { 
        _logger.Log(e); 
       } 
       _logger.Log(sb.ToString()); 
       break; 
      case LogLevel.Off: 
       break; 

      default: 
       throw new ArgumentOutOfRangeException("level", level, "invalid logging level"); 
     } 
    } 

private ILogger _logger; 

    public HubLoggerAdapter(ILogger logger) 
     : base(null) 
    { 
     _logger = logger; 
    } 

    protected override ILog CreateLogger(string name, LogLevel level, bool showLevel, bool showDateTime, bool showLogName, string dateTimeFormat) 
    { 
     ILog log = new HubLogger(_logger, name, level, showLevel, showDateTime, showLogName, dateTimeFormat); 
     return log; 
    } 
} 
関連する問題