如何使用 VS 2015 配置 log4net 以进行集成测试?
How to configure log4net with VS 2015 for an Integration Test?
我正在为连接到硬件设备上的供应商 Rest Api 的 REST 端点进行集成测试。我的软件必须定期在物理设备上进行测试。我创建了一个测试项目 (VSTest VS 2015),我想将日志记录添加到我的测试工具中。我意识到 log4net 上有大量的文档,但我仍然无法使它工作。我的目标是登录到控制台和文件。供应商想要一个日志文件来验证我的测试是否已完成。
首先,我初始化 log4net 以读取独立文件。
using log4net.Config;
using log4net;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Diagnostics;
namespace MyProgram
{
[TestClass]
public class AssemblyInitializer
{
private static ILog log = null;
[AssemblyInitialize]
public static void Configure(TestContext Context)
{
Debug.WriteLine("Starting log4net setup and configuration");
XmlConfigurator.Configure(new FileInfo("log4net.properties"));
log = LogManager.GetLogger(typeof(AssemblyInitializer));
log.Debug("log4net initialized for Integration Test");
Debug.WriteLine("Completed log4net setup and configuration");
}
}
}
我的 log4net.properties 文件:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<log4net>
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionpattern value="%date [%thread] %-5level %logger{1} - %message%newline"/>
</layout>
</appender>
<appender name="FileAppender" type="log4net.Appender.FileAppender">
<file value="IntegrationTests.log" />
<appendToFile value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
</layout>
</appender>
<root>
<level value="DEBUG">
<appender-ref ref="ConsoleAppender"/>
<appender-ref ref="FileAppender"/>
</level>
</root>
</log4net>
</configuration>
我认为测试资源管理器不会读取 Assembly.Info 文件,但我包含了一个参考以防万一。
[assembly: log4net.Config.XmlConfigurator(Watch = false)]
我已经尝试了几乎所有我能想到的。我没主意了。任何帮助将不胜感激。
我要详细说明我的评论。因为 Log4Net 也让我抓狂。
这就是我的 NLog 测试项目 App.config 中的全部内容。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="nlog" type="NLog.Config.ConfigSectionHandler, NLog"/>
</configSections>
<appSettings>
</appSettings>
<nlog autoReload="true"
throwExceptions="true"
internalLogLevel="Debug" internalLogFile="c:\temp\nlog-test.log" >
<targets>
<target type="Console" name="console" error="true"/>
</targets>
<rules>
<logger name="*" writeTo="console" />
</rules>
</nlog>
</configuration>
您定义一个目标作为日志记录的目的地,然后指定哪些记录器写入该目标。
他们希望您使用 LoggingManger 为您要从中记录的每个 class 创建一个记录器(源)。但我只是将单个记录器包装在静态 class 中并创建了一些传递方法。您丢失了记录器可以自动为您捕获的一些详细信息(例如,记录调用的确切站点),但我通常在写入记录的消息中有足够的详细信息。
~
Nlog 正在 Github https://github.com/NLog/NLog。 Log4Net 仍然是 svn。这告诉了我一些事情。
NuGet 上还有一些不错的 Windows Nlog 表单目标。
下面的代码有效。这不是同一个实现,但我让两个记录器都可以工作。看我上面的评论。我相信日志文件要么位于未知位置,要么我应该一路访问存储库。以下代码运行良好,并在我的测试 运行 之前进行初始化,并根据需要记录我的测试结果。
using log4net;
using log4net.Config;
using log4net.Repository.Hierarchy;
using log4net.Core;
using log4net.Appender;
using log4net.Layout;
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace MyProgram
{
[TestClass]
public class AssemblyInitializer
{
private static ILog log = null;
[AssemblyInitialize]
public static void Configure(TestContext Context)
{
Debug.WriteLine("Starting log4net setup and configuration");
Hierarchy hierarchy = (Hierarchy)LogManager.GetRepository();
hierarchy.Root.RemoveAllAppenders();
PatternLayout patternLayout = new PatternLayout();
patternLayout.ConversionPattern = "%date [%thread] %-5level %logger - %message%newline";
patternLayout.ActivateOptions();
FileAppender fileAppender = new FileAppender();
fileAppender.Name = "Integration Test FileAppender";
fileAppender.File = @"Logs\IntegrationTest.log";
fileAppender.AppendToFile = false;
fileAppender.Layout = patternLayout;
fileAppender.ActivateOptions();
hierarchy.Root.AddAppender(fileAppender);
ConsoleAppender consoleAppender = new ConsoleAppender();
consoleAppender.Name = "Integration Test ConsoleAppender";
consoleAppender.Target = Console.Out.ToString();
consoleAppender.ActivateOptions();
consoleAppender.Layout = patternLayout;
hierarchy.Root.AddAppender(consoleAppender);
hierarchy.Root.Level = Level.Debug;
hierarchy.Configured = true;
log = LogManager.GetLogger(typeof(AssemblyInitializer));
log.Debug("log4net initialized for Integration Test");
Debug.WriteLine("Completed log4net setup and configuration");
}
}
}
我正在为连接到硬件设备上的供应商 Rest Api 的 REST 端点进行集成测试。我的软件必须定期在物理设备上进行测试。我创建了一个测试项目 (VSTest VS 2015),我想将日志记录添加到我的测试工具中。我意识到 log4net 上有大量的文档,但我仍然无法使它工作。我的目标是登录到控制台和文件。供应商想要一个日志文件来验证我的测试是否已完成。
首先,我初始化 log4net 以读取独立文件。
using log4net.Config;
using log4net;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Diagnostics;
namespace MyProgram
{
[TestClass]
public class AssemblyInitializer
{
private static ILog log = null;
[AssemblyInitialize]
public static void Configure(TestContext Context)
{
Debug.WriteLine("Starting log4net setup and configuration");
XmlConfigurator.Configure(new FileInfo("log4net.properties"));
log = LogManager.GetLogger(typeof(AssemblyInitializer));
log.Debug("log4net initialized for Integration Test");
Debug.WriteLine("Completed log4net setup and configuration");
}
}
}
我的 log4net.properties 文件:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<log4net>
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionpattern value="%date [%thread] %-5level %logger{1} - %message%newline"/>
</layout>
</appender>
<appender name="FileAppender" type="log4net.Appender.FileAppender">
<file value="IntegrationTests.log" />
<appendToFile value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
</layout>
</appender>
<root>
<level value="DEBUG">
<appender-ref ref="ConsoleAppender"/>
<appender-ref ref="FileAppender"/>
</level>
</root>
</log4net>
</configuration>
我认为测试资源管理器不会读取 Assembly.Info 文件,但我包含了一个参考以防万一。
[assembly: log4net.Config.XmlConfigurator(Watch = false)]
我已经尝试了几乎所有我能想到的。我没主意了。任何帮助将不胜感激。
我要详细说明我的评论。因为 Log4Net 也让我抓狂。
这就是我的 NLog 测试项目 App.config 中的全部内容。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="nlog" type="NLog.Config.ConfigSectionHandler, NLog"/>
</configSections>
<appSettings>
</appSettings>
<nlog autoReload="true"
throwExceptions="true"
internalLogLevel="Debug" internalLogFile="c:\temp\nlog-test.log" >
<targets>
<target type="Console" name="console" error="true"/>
</targets>
<rules>
<logger name="*" writeTo="console" />
</rules>
</nlog>
</configuration>
您定义一个目标作为日志记录的目的地,然后指定哪些记录器写入该目标。
他们希望您使用 LoggingManger 为您要从中记录的每个 class 创建一个记录器(源)。但我只是将单个记录器包装在静态 class 中并创建了一些传递方法。您丢失了记录器可以自动为您捕获的一些详细信息(例如,记录调用的确切站点),但我通常在写入记录的消息中有足够的详细信息。 ~ Nlog 正在 Github https://github.com/NLog/NLog。 Log4Net 仍然是 svn。这告诉了我一些事情。
NuGet 上还有一些不错的 Windows Nlog 表单目标。
下面的代码有效。这不是同一个实现,但我让两个记录器都可以工作。看我上面的评论。我相信日志文件要么位于未知位置,要么我应该一路访问存储库。以下代码运行良好,并在我的测试 运行 之前进行初始化,并根据需要记录我的测试结果。
using log4net;
using log4net.Config;
using log4net.Repository.Hierarchy;
using log4net.Core;
using log4net.Appender;
using log4net.Layout;
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace MyProgram
{
[TestClass]
public class AssemblyInitializer
{
private static ILog log = null;
[AssemblyInitialize]
public static void Configure(TestContext Context)
{
Debug.WriteLine("Starting log4net setup and configuration");
Hierarchy hierarchy = (Hierarchy)LogManager.GetRepository();
hierarchy.Root.RemoveAllAppenders();
PatternLayout patternLayout = new PatternLayout();
patternLayout.ConversionPattern = "%date [%thread] %-5level %logger - %message%newline";
patternLayout.ActivateOptions();
FileAppender fileAppender = new FileAppender();
fileAppender.Name = "Integration Test FileAppender";
fileAppender.File = @"Logs\IntegrationTest.log";
fileAppender.AppendToFile = false;
fileAppender.Layout = patternLayout;
fileAppender.ActivateOptions();
hierarchy.Root.AddAppender(fileAppender);
ConsoleAppender consoleAppender = new ConsoleAppender();
consoleAppender.Name = "Integration Test ConsoleAppender";
consoleAppender.Target = Console.Out.ToString();
consoleAppender.ActivateOptions();
consoleAppender.Layout = patternLayout;
hierarchy.Root.AddAppender(consoleAppender);
hierarchy.Root.Level = Level.Debug;
hierarchy.Configured = true;
log = LogManager.GetLogger(typeof(AssemblyInitializer));
log.Debug("log4net initialized for Integration Test");
Debug.WriteLine("Completed log4net setup and configuration");
}
}
}