Noncompliant Code Examples:
class A
{
private static readonly ILogger Logger = Logger.ForContext<B>();
}
class B {} class A
{
private static readonly ILogger Logger = Log.ForContext<B>();
}
class B { }class A
{
ILogger<B> _log;
public A(ILogger<B> log)
{
_log = log;
}
}
class B { } class A(ILogger<B> log)
{
ILogger<B> _log = log;
}
class B { } class A
{
ILogger _log;
public A(ILoggerFactory loggerFactory)
{
_log = loggerFactory.CreateLogger<B>();
}
}
class B { }Compliant Solution:
class A
{
private static readonly ILogger Logger = Logger.ForContext<A>();
}
class B {} class A
{
private static readonly ILogger Logger = Log.ForContext<A>();
}
class B { }class A
{
ILogger<A> _log;
public A(ILogger<A> log)
{
_log = log;
}
}
class B {} class A(ILogger<A> log)
{
ILogger<A> _log = log;
}
class B {} class A
{
ILogger _log;
public A(ILoggerFactory loggerFactory)
{
_log = loggerFactory.CreateLogger<A>();
}
}
class B { }The rule covers the logger a type keeps for itself. A logger built on behalf of somebody else - handed to a constructor, returned from a factory method, registered in a container - is named after that somebody, so it is not reported:
class Worker
{
public Worker(ILogger<Worker> logger)
{
}
}
static class WorkerFactory
{
public static Worker Create(ILoggerFactory loggerFactory)
{
return new Worker(loggerFactory.CreateLogger<Worker>());
}
}static class WorkerLoggerFactory
{
public static ILogger<Worker> Create(ILoggerFactory loggerFactory)
{
return loggerFactory.CreateLogger<Worker>();
}
}
class Worker { }