我想尝试从我的应用中记录一些应用消息。在这种情况下,我只想强迫nunit使用log4net。我在这里找到了一些例子http://www.ofconsulting.com/PublicPortal/ofc-tech-blog/92-configure-log4net-with-nunit.html。
log4net在app.config中配置如下:
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,Log4net"/>
</configSections>
<log4net>
<root>
<level value="DEBUG" />
<appender-ref ref="LogFileAppender" />
</root>
<appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender" >
<param name="File" value="log.txt" />
<param name="AppendToFile" value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="10MB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%-5p%d{yyyy-MM-dd hh:mm:ss} – %m%n" />
</layout>
</appender>
</log4net>
我的测试代码正在关注
[TestFixture]
class DomainTests
{
protected static readonly ILog log = LogManager.GetLogger(typeof(DomainTests));
public void LoggingTests()
{
log4net.Config.XmlConfigurator.Configure();
}
[Test]
public void BasicLogTest()
{
log.Error("write my log entry already");
}
我的测试已通过,但log.txt文件中没有写入任何内容。我做错了什么?
我只想尽可能简单地存储消息,如输入应用程序,退出应用程序。问候。
答案 0 :(得分:21)
问题是NUnit测试运行器(当从visual studio中的resharper运行时)从另一个文件夹运行测试(它会影子复制测试程序集),因此除非您指定完整,否则xml配置在此时不可用配置路径。
您当然可以使用基本配置并在代码中指定日志记录配置,例如:
log4net.Config.BasicConfigurator.Configure(
new log4net.Appender.ConsoleAppender {
Layout = new log4net.Layout.SimpleLayout()});
之后你应该在测试输出中看到日志输出。
答案 1 :(得分:5)
我最好的猜测是你做这样的事情:
[TestFixture]
class DomainTests
{
protected static readonly ILog log = LogManager.GetLogger(typeof(DomainTests));
public void LoggingTests()
{
log4net.Config.XmlConfigurator.Configure();
}
[Test]
public void BasicLogTest()
{
log.Error("write my log entry already");
}
[SetUp]
RunBeforeAnyTests()
{
BasicConfigurator.Configure();
}
[TearDown]
RunAfterAnyTests()
{
// ...
}
我还使用Log4Net.config文件而不是app.config文件,它看起来更干净。以下是log4net.config文件的示例:
<log4net>
<!-- A1 is set to be a LogFileAppender -->
<appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender, log4net" >
<param name="File" value="C:\logging\log.txt" />
<file value="c:\logging\Main" />
<appendToFile value="true" />
<datePattern value="yyyyMMdd'.log'" />
<rollingStyle value="Composite" />
<staticLogFileName value="false" />
<maxSizeRollBackups value="-1" />
<maximumFileSize value="500MB" />
<!-- A1 uses PatternLayout -->
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
</layout>
</appender>
<!-- Set root logger level to DEBUG and its only appender to LogFileAppender -->
<root>
<!--<level value="OFF" />-->
<!--<level value="FATAL" />-->
<!--<level value="ERROR" />-->
<!--<level value="WARN" />-->
<!--<level value="INFO" />-->
<level value="DEBUG" />
<!--<level value="ALL" />-->
<appender-ref ref="LogFileAppender" />
</root>
</log4net>
答案 2 :(得分:4)
我知道并且使用log4net和nunit,我从未使用任何配置文件,你只需要在测试类构造函数中添加以下行
BasicConfigurator.Configure();
here is the full answer如果你想看样本测试类
答案 3 :(得分:3)
您可以调整单元测试以检查文件本身(而不是手动检查)。注意存储在环境变量中的文件路径。这也适用于TeamCity测试运行器(无需硬编码路径)。
配置:
<log4net>
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<file type="log4net.Util.PatternString" value="%env{ALLUSERSPROFILE}\test.log" />
<appendToFile value="true" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="10MB" />
<rollingStyle value="Size" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
</layout>
</appender>
<root>
<level value="INFO" />
<appender-ref ref="RollingLogFileAppender" />
</root>
</log4net>
代码:
private string _expectedFile;
[SetUp]
public void SetUp()
{
_expectedFile = Path.Combine(
Environment.GetEnvironmentVariable("ALLUSERSPROFILE"),
"test.log");
if (File.Exists(_expectedFile))
File.Delete(_expectedFile);
XmlConfigurator.Configure();
}
[Test] public void GivenLog4NetFileAppender_WhenLogInfoStringWithLog4Net_ThenWritesToDisk()
{
ILog log = LogManager.GetLogger(typeof (LoggingIntegrationTests));
log.Info("Message from test");
LogManager.Shutdown();
Assert.That(File.ReadAllText(_expectedFile),
Is.StringContaining("Message from test"));
}