log4net内存出现不工作

log4net内存出现不工作,log4net,appender,Log4net,Appender,我正在使用log4net登录我的应用程序。我的FileAppender工作正常,但我的MemoryAppender有问题 这是我的配置文件 我使用此代码设置配置文件 FileInfo file=newfileinfo(configPath); log4net.Config.XmlConfigurator.Configure(文件); file=null; 就像我说的,FileAppender工作得很好。但我似乎看不到任何事件。 我试着用这样的方法来获得记忆 Hierarchy Hierar

我正在使用log4net登录我的应用程序。我的FileAppender工作正常,但我的MemoryAppender有问题

这是我的配置文件


我使用此代码设置配置文件

FileInfo file=newfileinfo(configPath);
log4net.Config.XmlConfigurator.Configure(文件);
file=null;
就像我说的,FileAppender工作得很好。但我似乎看不到任何事件。 我试着用这样的方法来获得记忆

Hierarchy Hierarchy=LogManager.GetRepository()作为层次结构;
MemoryAppender mappender=hierarchy.Root.GetAppender(“MemoryAppender”)作为MemoryAppender;
我试过使用:

var events=mappender.GetEvents()
在记录了一些东西之后,事件总是空的。我尝试在代码中设置FileAppender和MemoryAppender,而不是使用配置文件,我得到了同样的结果,FileAppender工作正常,但似乎无法从MemoryAppender获取任何事件。好奇我是否理解了记忆的出现,对吗?我还尝试设置一个线程,循环检查GetEvents是否为空,当注销时,它总是返回空。我尝试将阈值设置为MemoryAppender上的Core.Level.All,但这并没有改变任何事情

谢谢你的指点。我环顾了四周,从我所看到的网站上,我看不出我有什么不同

即使像这样简单的事情也不行。事件长度始终为零

公共部分类主窗口:窗口{
公共主窗口(){
初始化组件();
MemoryAppender appender=新的MemoryAppender();
iloglogger=LogManager.GetLogger(“foo”);
基本配置器配置(appender);
记录器错误(“应该工作”);
var events=appender.GetEvents();
}
}

使用log4net 1.2.10.0,您发布的简单示例代码对我来说非常有用


我建议下载源代码并在调试器中单步执行。一开始可能有点让人畏缩,但你很快就习惯了他们的代码,而且也不难理解。当我在自定义约束和附加器方面遇到问题时,我已经多次这样做了。它确实有助于快速解决问题,并让您更好地了解log4net的工作原理。

我找到了答案。我错误地使用了Compact Framework.dll。一旦我意识到我切换到了.net 2.0版本,这导致了找不到log4net名称空间的问题,所以我对此进行了搜索,并意识到我需要将.net Framework 4客户端配置文件更改为.net Framework 4。我现在得到了预期的事件。

对于那些需要它的人,这里介绍了如何在C#中以编程方式完成它:


我在单元测试中使用了上面的Ralph代码:

using log4net;
using log4net.Appender;
// ...
internal static MemoryAppender GetMemoLog<T>() where T: class 
{
    var memoLog = new MemoryAppender();
    ILog appendableLog = LogManager.GetLogger(typeof(T).Assembly, typeof(T));
    var repository = (log4net.Repository.Hierarchy.Hierarchy)appendableLog.Logger.Repository;
    repository.Root.AddAppender(memoLog);            
    var logField = typeof(T).GetField("Log", BindingFlags.Static | BindingFlags.NonPublic);
    if (logField != null) logField.SetValue(null, appendableLog);
    return memoLog;
}
所以,在测试中,它只是:

var memoLog = GetMemoLog<MyClass>(); 
// followed by test logic, and then... 
var events = memoLog.GetEvents();
var memoLog=GetMemoLog();
//然后是测试逻辑,然后。。。
var events=memoLog.GetEvents();

我修改了扎哈罗布斯基的答案。必须稍微调整一下,因为我的类不能设计静态记录器

被测类的日志字段声明如下:

private ILog Logger = Log4netFactory.GetLogger(typeof(MyClass));
在GetMemLog逻辑中,我必须首先创建MyClass的一个实例,并通过名称“Logger”和BindingFlags.instance而不是BindingFlags.Static更改getField的logField查找

//create an instance of the class
var myObject = new MyClass(context);

var memoryLog = new MemoryAppender();
ILog appendableLog = LogManager.GetLogger(typeof(JobQueue).Assembly, typeof(MyClass));
var repository = (log4net.Repository.Hierarchy.Hierarchy)appendableLog.Logger.Repository;
repository.Root.AddAppender(memoryLog);
var logField = typeof(MyClass).GetField("Logger", BindingFlags.NonPublic | BindingFlags.Instance);

if (logField != null)
{
    //set logfield property value for the instance
    logField.SetValue(myObject, appendableLog);
}

PropertyInfo的SetValue()示例非常精彩,谢谢!我只是想捕获用于单元测试的日志行(不向我的项目添加模拟框架),所以我修改了您的代码
private ILog Logger = Log4netFactory.GetLogger(typeof(MyClass));
//create an instance of the class
var myObject = new MyClass(context);

var memoryLog = new MemoryAppender();
ILog appendableLog = LogManager.GetLogger(typeof(JobQueue).Assembly, typeof(MyClass));
var repository = (log4net.Repository.Hierarchy.Hierarchy)appendableLog.Logger.Repository;
repository.Root.AddAppender(memoryLog);
var logField = typeof(MyClass).GetField("Logger", BindingFlags.NonPublic | BindingFlags.Instance);

if (logField != null)
{
    //set logfield property value for the instance
    logField.SetValue(myObject, appendableLog);
}