0

我正在为 REST 端点进行集成测试,该端点连接到硬件设备上的供应商 Rest Api。我的软件必须定期在物理设备上进行测试。我创建了一个测试项目(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)]

我已经尝试了几乎所有我能想到的东西。我没主意了。任何帮助,将不胜感激。

4

2 回答 2

0

下面的代码有效。这不是同一个实现,但我让两个记录器都可以工作。看我上面的评论。我相信日志文件位于未知位置,或者我应该一路访问存储库。以下代码运行良好并在我的测试运行之前进行初始化,并根据需要记录我的测试结果。

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");

        }
    }
}
于 2016-07-27T19:53:21.223 回答
-1

我将扩展我的评论。因为 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 为您要登录的每个类创建一个记录器(一个源)。但我只是将一个记录器包装在一个静态类中并创建了一些传递方法。您丢失了记录器可以自动为您捕获的一些详细信息(例如,记录调用的确切位置),但我通常在我写的消息中有足够的详细信息来记录。~ Nlog 在 Github https://github.com/NLog/NLog上。Log4Net 仍然是 svn。这告诉我一些事情。

NuGet 上还有一些不错的 Nlog Windows 窗体目标。

于 2016-07-19T11:31:18.820 回答