如何使用包装类时log4net的
我实现一个自定义的XML格式的log4.net如何使用包装类时log4net的
public class ISDSApplicationEventsLayout : XmlLayoutBase
{
protected override void FormatXml(...)
{
//Location Info
writer.WriteStartElement("Method");
writer.WriteString(**loggingEvent.LocationInformation.MethodName * *);
writer.WriteEndElement();
}
}
问题是...登录方法的名称现在,当我调用日志方法从我的日志包装类。 ..所谓的记录
public static void logEvent(string message)
{
log.Info(isdsLog);
}
我得到的输出....
<Method>logEvent</Method>
怎么可能有调用该方法的名称logEvent,而不是logEvent作为方法名?
谢谢
问题更新:
如果这上面似乎有点复杂 - 什么,我要问的是:你如何保持在称为包装记录功能的方法的上下文log4net的...
例如...方法的doWork()调用... - >日志包装 - >调用log4net的....
你怎么做的方法名=的doWork和不记录WRA pper功能....
实际上,您可以使用开箱即用的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);
}
}
当log4net的消息记录,它遍历调用堆栈,直到它到达其声明类型等于传递进来的第一个参数类型的方法Log方法。堆栈中的下一个方法是实际的呼叫站点。
至于包装log4net记录器,我不知道我会建议创建一个静态包装类。主要的问题是你的app.config文件中只能有一个可配置的记录器。换句话说,您将无法独立控制代码的不同部分的日志记录。如果你有A类和B类,并且都使用你的静态包装记录器,那么这两个类将记录在同一个级别。如果你想让A级的登录和B级的登录失效,你将无法做到这一点。
当然,有时候你不会看到脸上盯着你。那么,如果你把代码修改为`log.Logger.Log(...)`至少:) – 2010-12-09 09:25:52
我不认为你可以用开箱即用的log4net轻松解决这个问题。如果我们看一看在the LogImpl class的ILog.Info方法,您呼叫:
virtual public void Info(object message)
{
Logger.Log(ThisDeclaringType, m_levelInfo, message, null);
}
当记录一条消息,log4net的会走当前呼叫的堆栈跟踪,以便找到发起的方法日志操作。为此,Log4net使用“ThisDeclaringType”类型作为搜索的边界,选择该类型内的第一个“上方”调用作为启动方法。
就你而言,遇到的第一个方法是logEvent方法。如果您删除了logEvent包装器并直接使用记录方法,您将获得所需的信息。
实际上,可以创建一个可以成功保存通话的记录器包装器网站信息。请参阅我的答案中的代码示例,了解执行此操作的一种方法。关键是将包装的记录器的类型作为第一个参数传递给Log方法(而不是使用Info,Debug等方法)。 – wageoghe 2010-12-08 20:18:59
[使用包装时,如何保留Log4Net的日志类和方法名?](http:// stackoverflow。com/questions/2049992/when-using-wrapper-how-to-preserve-class-and-method-name-for-log4net-to-log) – 2017-02-04 10:20:00