我正在为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班开关,你将无法这样做.