coloredconsoleappender - log4net table
argumento log4net para LogManager.GetLogger (4)
¿Por qué la mayoría de los ejemplos de log4net obtienen el registrador de una clase al hacer esto?
private static ILog logger =
LogManager.GetLogger(
System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
En lugar de simplemente pasar typeof (MyClass):
private static ILog logger = LogManager.GetLogger(typeof(MyClass));
¿Hay alguna otra razón para hacer esto, además del hecho de que la primera opción no requiere que escriba un nombre de clase específico?
Como dices, es conveniente ya que puedes crear un registrador en un método sin saber el nombre de la clase (algo trivial que conozco) pero te permite cortar y pegar métodos entre clases sin tener que cambiar el nombre de la llamada.
Creo que la razón es que obtienes el tipo del tipo de tiempo de ejecución usando el método .DeclaringType()
. Puede usar el registrador en una clase base y aún ver el tipo real de su objeto en la salida de los registradores. Eso hace que las investigaciones sean mucho más convenientes.
Creo que tienes la razón. Lo hago de esa manera, así que no tengo que preocuparme por el nombre de la clase y puedo copiar y pegar el código de la placa de la caldera en una nueva clase.
Para la respuesta oficial, consulte: ¿Cómo obtengo el nombre completo de una clase en un bloque estático? en log4net faq
Soy un usuario de NLog, y generalmente esto se reduce a:
var _logger = LogManager.GetCurrentClassLogger();
Me pareció un poco extraño que necesitaras reflexionar en Log4Net, así que eché un vistazo al código fuente de NLog, y he aquí, esto es lo que hacen por ti:
[MethodImpl(MethodImplOptions.NoInlining)]
public static Logger GetCurrentClassLogger()
{
string loggerName;
Type declaringType;
int framesToSkip = 1;
do
{
#if SILVERLIGHT
StackFrame frame = new StackTrace().GetFrame(framesToSkip);
#else
StackFrame frame = new StackFrame(framesToSkip, false);
#endif
var method = frame.GetMethod();
declaringType = method.DeclaringType;
if (declaringType == null)
{
loggerName = method.Name;
break;
}
framesToSkip++;
loggerName = declaringType.FullName;
} while (declaringType.Module.Name.Equals("mscorlib.dll", StringComparison.OrdinalIgnoreCase));
return globalFactory.GetLogger(loggerName);
}
Supongo que escribiría algo similar para Log4Net como una extensión o método estático en lugar de pegar el reflejo como parte de mi código de la caldera :)