2009-07-19 34 views
9

Me estoy poniendo en práctica un formateador XML personalizado para log4.netcómo ingresar el nombre del método al utilizar clase contenedora con Log4net

public class ISDSApplicationEventsLayout : XmlLayoutBase 
{ 
    protected override void FormatXml(...) 
    { 
     //Location Info 
     writer.WriteStartElement("Method"); 
     writer.WriteString(**loggingEvent.LocationInformation.MethodName * *); 
     writer.WriteEndElement(); 
    } 
} 

El problema es ... ahora cuando llamo el método de registro de mi clase contenedora de registro. .. llamada tala

public static void logEvent(string message) 
{ 
    log.Info(isdsLog); 
} 

consigo la salida ....

<Method>logEvent</Method> 

¿Cómo es posible tener el nombre del método que llama logEvent, en lugar de logEvent como el nombre del método?

Gracias

Pregunta Actualización:

Si esto anterior parece un poco complicado - lo que realmente estoy preguntando es: ¿Cómo se mantiene el contexto del método que se llama la función de registro de envolver en log4net ...

ejemplo ... DoWork método() llama ... -> registro envoltorio -> llamadas log4net ....

¿Cómo se hace la methodname = DoWork y no ha accedido WRA función pper ....

+0

Posible duplicado de [Al usar envoltorio, cómo conservar el nombre de clase y método para que Log4Net inicie sesión?] (Http: // stackoverflow.com/questions/2049992/when-using-wrapper-how-to-preserve-class-and-method-name-for-log4net-to-log) –

Respuesta

14

En realidad, puede solucionarlo fácilmente con log4net listo para usar. Su contenedor puede llamar a Logger.Log y pasar el tipo de su clase contenedora como primer parámetro. Por lo tanto, su envoltorio podría ser algo como esto:

public class MyLog4NetWrapper 
{ 
    ILog log = LogManager.GetLogger("WhateverYourLoggerNameIs"); 

    public void logEvent(string message) 
    {  
    log.Logger.Log(typeof(MyLog4NetWrapper), LogLevel.Info, message, null); 
    } 
} 

Cuando log4net registra un mensaje, que atraviesa la pila de llamadas hasta que llega al método cuyo declarando tipo es igual al tipo que se pasa como primer parámetro de el método de registro. El siguiente método en la pila es el sitio real de llamadas.

En cuanto a ajustar el log log lognet, no estoy seguro de que recomendaría crear una clase contenedora estática. El principal problema es que solo puedes tener un único registrador configurable en tu archivo app.config. En otras palabras, no podrá controlar independientemente el registro desde diferentes partes de su código. Si tiene clase A y clase B y ambos utilizan su registrador envuelto estático, ambas clases se registrarán en el mismo nivel. Si quisiera iniciar sesión para la clase A y desactivarla para la clase B, no podría hacerlo.

+0

Ah, por supuesto, a veces uno no ve lo que está mirando a la cara. Bueno, si arreglas tu código para 'log.Logger.Log (...)' al menos :) –

+0

¡Sí, tienes razón! Arreglaré la muestra del código. – wageoghe

1

No creo que pueda solucionarlo fácilmente con log4net listo para usar. Si echamos un vistazo al método ILog.Info en the LogImpl class, que está llamando:

virtual public void Info(object message) 
    { 
     Logger.Log(ThisDeclaringType, m_levelInfo, message, null); 
    } 

Cuando se registra un mensaje, log4net caminará la StackTrace de la llamada en curso con el fin de encontrar el método que inició la operación de registro Para hacer esto, Log4net usa el tipo "ThisDeclaringType" como el límite de la búsqueda, la primera llamada "arriba" de las llamadas dentro de ese tipo se elige como el método de inicio.

En su caso, el primer método encontrado es el método logEvent. Si eliminó el contenedor logEvent y usó los métodos de registro directamente, obtendrá la información deseada.

+0

En realidad, es posible crear un contenedor logger que pueda conservar la llamada con éxito Información del sitio. Vea el ejemplo de código en mi respuesta para una forma de hacerlo. La clave pasa el tipo del registrador envuelto como primer parámetro del método de registro (en lugar de utilizar los métodos de información, depuración, etc.). – wageoghe

Cuestiones relacionadas