2016-10-27 3 views
0

내 커스텀 로거를 호출하기 위해 Common.Logging을 가져 오려고하지만 WriteInternal이 호출되지 않습니다. 나는 어딘가에 구성을 놓쳤는가? 내 ASP.NET Owin 프로젝트에서 Startup.cs는WriteInternal이 Common.Logging에서 호출되지 않았습니다. AbstractLogger 파생물

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

입니다. 여기서 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; 
    } 
} 

처럼 보이는 로거는 내가 = LogManager.GetLogger() VAR 로거를 호출 할 경우

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 매개 변수를 받아들이는 public 생성자 " – 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; 
    } 
}