使用包含Log4net的包装类时如何记录方法名称

JL.*_*JL. 9 .net log4net

我正在为log4.net实现一个自定义XML格式化程序

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

问题是......现在当我从日志包装器类调用log方法时...称为日志记录

public static void logEvent(string message)
{
    log.Info(isdsLog); 
}
Run Code Online (Sandbox Code Playgroud)

我得到输出....

  <Method>logEvent</Method>
Run Code Online (Sandbox Code Playgroud)

如何使用名为logEvent的方法名称而不是logEvent作为方法名称?

谢谢

问题更新:

如果上面这看起来有点复杂 - 我真正要问的是:你如何保留在log4net中调用包装日志功能的方法的上下文...

示例...方法doWork()...调用 - >日志包装器 - >调用log4net ....

你如何使methodname = doWork和NOT日志包装函数....

wag*_*ghe 17

实际上,您可以使用开箱即用的log4net轻松解决此问题.您的包装器可以调用Logger.Log并将包装类的类型作为第一个参数传递.所以,你的包装器可能看起来像这样:

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

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

当log4net记录消息时,它会遍历调用堆栈,直到它到达其声明类型等于作为Log方法的第一个参数传入的类型的方法.堆栈的下一个方法是实际的呼叫站点.

至于包装log4net记录器,我不确定我是否会建议创建一个静态包装器类.主要问题是您的app.config文件中只能有一个可配置的记录器.换句话说,您将无法独立控制代码不同部分的日志记录.如果您有A类和B类,并且都使用静态包装的记录器,那么这两个类将记录在同一级别.如果你想为A类开启登录,对B班开关,你将无法这样做.