将代码中的Appender添加到根以进行测试-Log4Net



我正试图通过测试类中的代码向root记录器添加一个自定义附加程序。我已经在一个名为Logging.cs的包装类中配置了log4net

这是我在Logging.cs类中的构造函数:

public Logging(Type type)
{
XmlDocument log4netConfig = new XmlDocument();
log4netConfig.Load(File.OpenRead("log4net.config"));
var repo = LogManager.CreateRepository(Assembly.GetEntryAssembly(), typeof(log4net.Repository.Hierarchy.Hierarchy));
XmlConfigurator.Configure(repo, log4netConfig["log4net"]);
log4netLogger = LogManager.GetLogger(type);
LogManager.GetLogger(type);
}

在看了一些例子后,我将其编码到我未完成的测试方法中:

[Fact]
public void TestOutput()
{
var appender = new StringAppender();
var logger = new Logging(typeof(TestLibrary));
Hierarchy h = (Hierarchy)log4net.LogManager.GetRepository();
Logger rootLogger = h.Root;
}

然而,GetRepository()需要一个作为string的repo名称,我对此不确定,而且通常我不知道我是否走在正确的道路上。

这是自定义附加程序:

public class StringAppender : AppenderSkeleton
{
private string message { get; set; }
protected override void Append(LoggingEvent loggingEvent)
{
message = loggingEvent.RenderedMessage;
}
public string GetMessage()
{
return message;
}
}

经过更多的研究和实验,我发现如果你通过Assembly.GetEntryAssembly()LogManager.GetRepository()对我有效

工作代码为:

// my custom appender
var appender = new StringAppender();
// my logger wrapper class
var logger = new Logging(typeof(TestLibrary));
// hierachy 
Hierarchy h = (Hierarchy)log4net.LogManager.GetRepository(Assembly.GetEntryAssembly());
// get the root logger
Logger rootLogger = h.Root;
// add the appender
rootLogger.AddAppender(appender);
// set the root logger level
rootLogger.Level = Level.Debug;
// log4net via the wrapper class
logger.Debug("Hello, from TestLibrary Class");

最新更新