내 커스텀 로거를 호출하기 위해 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;
생성자는 어떤 차이가 왜 확실하지
을 사용했다.
http://netcommon.sourceforge.net/docs/1.2.0/reference/html/logging.html : 1.5.1 : "중요 : 모든 구현은을 제공해야 NameValueCollection 매개 변수를 받아들이는 public 생성자 " – Caramiriel
어떻게하면 거기에 객체를 전달할 수 있을지 궁금합니다. – tofutim
그리고 그것은 정말 이상합니다. 우리가 직접 만들지 않습니까? 나는 너의 제안을 시도했지만 도움이되지 못했다. – tofutim