在使用包装器的时候,如何保存Log4Net的类和方法名来logging?

我需要一个Log4net包装 – 在大型应用程序中暴露给许多不同的组件。 我显然希望在logging时保留类和方法的名字,但我会保持传递types等传递给我的包装。

我看了一个和我的很相似的问题 ,但是没有帮助。

我已经看到它在这样的其他问题完成与smt如下:

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

这并不理想,因为它没有使用开箱即用的Log4Netfunction。

我想知道人们在做这些事情之前是怎么做的,然后想出一些非常复杂的东西。 任何指针(链接/资源/样本)赞赏!

我通常添加这个…(这是我需要的所有function)

 MethodBase.GetCurrentMethod().Name 

你总是可以创build一个Log4Net的包装,它需要你需要的任何参数(如MethodBase)?

Log4net允许你像这个%方法那样访问方法名。 这不是最快的操作,但是如果你需要debugging一些东西,你可能会很好的使用它。 我相信你的问题是,如果你使用包装,log4net将不会输出正确的方法名。

为了解决这个问题,你必须看看log4net如何编写ILog实现。 这基本上是内部log4netlogging器的一个包装,因此, ILog实现也是一样的问题。 我基本上做了以下几点:

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

显然还有一些事情要做,但重要的一点是提到的。

像这样创build你的包装类

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

按以下方式configuration您的log4net.config文件…

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

现在只需使用上面的这些方法…

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