2010-01-12 11 views
7

Necesito una envoltura de Log4net para estar expuesto a una serie de componentes diferentes en una aplicación grande. Obviamente, quiero conservar la clase y el nombre del método al iniciar sesión, pero me mantendría alejado de pasar el tipo, etc. a mi contenedor.Al usar wrapper, ¿cómo conservar el nombre de clase y método para que Log4Net inicie sesión?

Eché un vistazo a this question que es muy similar al mío, pero no ayudó.

que he visto hacer en this other question con SMT como la siguiente:

MethodBase methodBase = new StackTrace().GetFrame(1).GetMethod(); 
this.log.Debug(methodBase.Name + " : " + message); 

Esto no es ideal ya que no está utilizando la funcionalidad Log4net fuera de la caja.

Me gustaría tener una idea de cómo las personas están haciendo esto antes de ir por la tangente y encontrar algo muy complicado. Cualquier puntero (enlaces/recursos/muestras) apreciado!

Respuesta

2

Yo suelo añadir algo de este ... (que es toda la funcionalidad que necesito)

MethodBase.GetCurrentMethod().Name 

siempre se puede crear un contenedor para Log4net que toma cualquier params que necesita (como MethodBase)?

+1

Gracias - Me gustaría evitar pasar el tipo y methodName. – JohnIdol

4

Log4net le permite acceder al nombre del método, por ejemplo, como este método%. Esta no es la operación más rápida, pero si necesita depurar algo, es muy posible que lo use. Creo que su pregunta es acerca del hecho de que log4net no generará el nombre correcto del método si usa un contenedor.

Para resolver ese problema, tiene que ver cómo log4net escribió la implementación ILog. Esto es básicamente una envoltura alrededor del registrador de log4net interno y, por lo tanto, el mismo problema también se aplica a la implementación de ILog. Básicamente hice lo siguiente:

// define a field such as this 
private static readonly Type ThisDeclaringType = typeof(MyLogWrapper); 

// in constructor. Note: I use the internal Logger! 
this.Logger = LogManager.GetLogger(name).Logger; 

// I created a WriteLog method that calls the internal logger like this 
// you will need to translate to the internal log levels 
// message and ex are the items I want to log (ex can be null) 
this.Logger.Log(MyLogWrapper.ThisDeclaringType, log4netLevel, message, ex); 

Obviamente, todavía quedan cosas por hacer, pero se mencionan los puntos importantes.

3

Cree su clase contenedora así ...

public static class LogFourNet 
    { 
     // Define a static logger variable so that it references the 
     private static readonly ILog Log = LogManager.GetLogger(typeof(LogFourNet)); 

     static LogFourNet() 
     { 
      XmlConfigurator.Configure(
        new FileInfo(AppDomain.CurrentDomain.BaseDirectory + "log4net.config")); 
      Log.Info("Log4net is configured."); 
     } 

     public static void Info(object currentObj, string msg, [CallerLineNumber] int lineNumber = 0, 
      [CallerFilePath] string caller = "", [CallerMemberName] string memberName = "") 
     { 
      Log.Info("[" + currentObj.GetType().Namespace + "." + 
        Path.GetFileNameWithoutExtension(caller) + "." + memberName + ":" + lineNumber + "] - " + msg); 
     } 

     public static void Debug(object currentObj, string msg, [CallerLineNumber] int lineNumber = 0, 
      [CallerFilePath] string caller = "", [CallerMemberName] string memberName = "") 
     { 
      Log.Debug("[" + currentObj.GetType().Namespace + "." + 
         Path.GetFileNameWithoutExtension(caller) + "." + memberName + ":" + lineNumber + "] - " + msg); 
     } 

     public static void Error(object currentObj, string msg, [CallerLineNumber] int lineNumber = 0, 
      [CallerFilePath] string caller = "", [CallerMemberName] string memberName = "") 
     { 
      Log.Error("[" + currentObj.GetType().Namespace + "." + 
         Path.GetFileNameWithoutExtension(caller) + "." + memberName + ":" + lineNumber + "] - " + msg); 
     } 
    } 

Configure su archivo log4net.config de la siguiente manera ...

<configuration> 
    <configSections> 
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> 
    </configSections> 
    <log4net> 
    <appender name="FileAppender" type="log4net.Appender.FileAppender"> 
     <file value="logfile.log" /> 
     <appendToFile value="true" /> 
     <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%d [%t] %-5p - %m%n" /> 
     </layout> 
    </appender> 
    <root> 
     <!--LogLevel: OFF, FATAL, ERROR, WARN, INFO, DEBUG, ALL --> 
     <level value="ALL" /> 
     <appender-ref ref="FileAppender" /> 
    </root> 
    </log4net> 
</configuration> 

Ahora solo usa estos métodos como este ...

// need to pass this(current obj) as we want to log full class name 
LogFourNet.Debug(this, "started something from wrapper"); 

output: 
------- 
2017-02-04 15:38:37,549 [1] DEBUG [WebAPI_DI.Startup.Configuration:25] - started something from wrapper 
Cuestiones relacionadas