I am trying to get Common.Logging to call my custom logger, but WriteInternal is never called. Did I miss a configuration somewhere? In my ASP.NET Owin project, Startup.cs has
LogManager.Adapter = new HubLoggerAdapter(resolver.Kernel.Get<ILogger>());
where ILogger is my custom logger. HubLoggerAdapter looks like
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;
}
}
and the logger looks like
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");
}
}
}
If I call var logger = LogManager.GetLogger(); logger.Warn("I'm alive.");
I see "initiating HubLogger" but then WriteInternal is never called for my message. It is really odd. Any insight much appreciated.
Edit 1. Tried to add constructor with NameValueCollection per suggestion, but it did not work. Specifically added
private ILogger _logger;
public IKernel Kernel { get; set; }
public HubLoggerAdapter(NameValueCollection props)
{
// _logger = props["logger"]; }
public HubLoggerAdapter(ILogger logger)
{
_logger = logger;
}
and used
var props = new NameValueCollection();
var adapter = new HubLoggerAdapter(props);
adapter.Kernel = resolver.Kernel;
LogManager.Adapter = adapter;
not sure why the constructor would make any difference.