Quando si usa wrapper, come conservare la class e il nome del metodo per Log4Net da registrare?

Ho bisogno di un wrapper Log4net – per essere esposto a un numero di componenti diversi in una grande app. Ovviamente voglio mantenere il nome della class e del metodo durante la registrazione, ma vorrei evitare di passare il tipo ecc. Al mio wrapper.

Ho dato un’occhiata a questa domanda che è molto simile alla mia, ma non ha aiutato.

L’ho visto fatto in questa altra domanda con smt come il seguente:

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

Questo non è l’ideale dato che non sta utilizzando la funzionalità Log4Net pronta all’uso.

Mi piacerebbe avere un’idea di come le persone stanno facendo questo prima di andare per la tangente e trovare qualcosa di molto complicato. Qualsiasi suggerimento (link / risorse / campioni) apprezzato!

Di solito aggiungo qualcosa … (sono tutte le funzionalità di cui ho bisogno)

 MethodBase.GetCurrentMethod().Name 

potresti sempre creare un wrapper per Log4Net che prende tutti i parametri necessari (come MethodBase)?

Log4net ti permette di accedere al nome del metodo per esempio come questo metodo%. Questa non è l’operazione più veloce, ma se hai bisogno di eseguire il debug di qualcosa potresti usarla molto bene. Credo che la tua domanda riguardi il fatto che log4net non restituirà il nome corretto del metodo se usi un wrapper.

Per risolvere questo problema devi vedere come log4net ha scritto l’implementazione di ILog . Questo è fondamentalmente un wrapper attorno al logger log4net interno e quindi lo stesso problema si applica ILog all’implementazione di ILog . Ho fatto sostanzialmente il seguente:

 // 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); 

Ovviamente ci sono ancora alcune cose da fare, ma i punti importanti sono menzionati.

Crea la tua class wrapper come questa …

 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); } } 

Configura il tuo file log4net.config nel modo seguente …

   

Ora basta usare sopra questi metodi come questo …

 // 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