Este código parece familiar para você?
namespace MyNamespace
{
public class MyClass
{
private static Logger logger = LogManager.GetCurrentClassLogger();
}
}
Para criar um logger, você deve acessar um LogManager estático que retorna um logger para sua classe. Isso deixará o código chato e repetitivo em todos os lugares e praticamente o mesmo para qualquer estrutura de registro por aí.
Alguém poderia dizer: Não no meu caso, eu tenho uma classe base para isso – que pode ser parecida com esta
namespace MyNamespace
{
public class MyBase
{
public Logger GetLogger()
{
return LogManager.GetLogger(this.GetType());
}
}
}
Isso ajuda em alguns casos em que você controla a classe base. Mas e se você precisar derivar de uma classe de terceiros? Bem, então você provavelmente está de volta à abordagem estática.
E se eu te disser que isso está para mudar?
Vejamos o seguinte trecho de código
public interface ILogAware { }
Bem, isso não parece emocionante, não é? Parece mais com nada.
Mas e se eu adicionar o código a seguir?
public static LogAwareExtensions
{
public static void LogDebug(this ILogAware logAware, string format, params object[] args)
{
var logger = LogManager.GetLogger(logAware.GetType());
logger.Debug(format, args);
}
}
De repente, não transformamos nada em uma ferramenta poderosa que adiciona capacidade de registro a qualquer uma de suas classes apenas implementando ILogAware – uma interface vazia – então nada precisa ser implementado.
Isso é o que chamo de magia c #.
Espero que ajude!