一个解决方案中的项目和单元测试的 log4net 配置 [英] log4net configuration for project and unit test in one solution

查看:26
本文介绍了一个解决方案中的项目和单元测试的 log4net 配置的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的解决方案包含一个 Windows 服务应用程序项目和一个单元测试项目,如下所示:

My solution contains a Windows Service application project and a Unit Test project, as shown here:

我已经在我的 Windows 服务应用程序项目中设置了 log4net,如下所示:

步骤 1) 我已将 log4net 的引用添加到我的 Windows 服务应用程序项目中.

Step 1) I've added the reference to log4net to my Windows Service application project.

步骤 2) 我的 app.config 如下所示:

Step 2) My app.config looks like this:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>

    <configSections>
      <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,Log4net"/>
    </configSections>

    <log4net>
      <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender">
        <file value="log.log" />
        <appendToFile value="true" />
        <rollingStyle value="Size" />
        <maxSizeRollBackups value="5" />
        <maximumFileSize value="100KB" />
        <staticLogFileName value="true" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%date %level %logger - %message %exception%newline" />
        </layout>
      </appender>
      <root>
        <level value="ALL" />
        <appender-ref ref="LogFileAppender" />
      </root>
    </log4net>

</configuration>

步骤 3) 我已将其添加到 Program.cs 主项:

Step 3) I've added this the Program.cs main:

using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Threading.Tasks;

[assembly: log4net.Config.XmlConfigurator(Watch = true)]

namespace MyAppService
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        static void Main()
        {
            log4net.Config.XmlConfigurator.Configure();

步骤 4) 在我记录的课程中,我添加了以下内容:

Step 4) In my classes where I am logging I've added this:

private static ILog logger = LogManager.GetLogger(typeof(Reader));

步骤 5) 我添加了这样的日志语句:

Step 5) I've added logging statements like this:

logger.Info("Data Read Completed Successfully.");

<小时>

-----------------------------单元测试项目设置----------------------------

<小时>

我已经在我的单元测试项目中设置了 log4net,如下所示:

步骤 1) 我已将 log4net 的引用添加到我的单元测试项目中.

Step 1) I've added the reference to log4net to my Unit Test project.

步骤 2) 我添加了一个 app.config 文件,如下所示:

Step 2) I've added a app.config file that looks like this:

    <?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  </startup>
  <appSettings>
    <add key="log4net.Internal.Debug" value="true"/>
  </appSettings>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
  </configSections>
  <log4net>
    <!-- A1 is set to be a ConsoleAppender -->
    <appender name="A1" type="log4net.Appender.FileAppender">
      <file value="logfile.txt" />
      <appendToFile value="false" />

      <!-- A1 uses PatternLayout -->
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%-4timestamp [%thread] %-5level %logger %ndc - %message%newline" />
      </layout>
    </appender>

    <!-- Set root logger level to DEBUG and its only appender to A1 -->
    <root>
      <level value="DEBUG" />
      <appender-ref ref="A1" />
    </root>
  </log4net>
</configuration>

第 3 步) 我已将此添加到 ForecastIOTest.cs 单元测试类:

Step 3) I've added this the ForecastIOTest.cs unit test class:

using log4net;
using log4net.Config;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;
using System.Collections.Generic;
using WeatherAppService;

[assembly: log4net.Config.XmlConfigurator(Watch = true)]

namespace WeatherAppTests
{
    [TestClass]
    public class ForecastIOTest
    {
        private static ILog logger = LogManager.GetLogger(typeof(WeatherController));

        [AssemblyInitialize]
        public static void Configure(TestContext tc)
        {
            log4net.Config.XmlConfigurator.Configure();
        }

步骤 4) 在我记录的测试类中,我添加了这个:

Step 4) In my test class where I am logging I've added this:

private static ILog logger = LogManager.GetLogger(typeof(ForecastIOTest));

步骤 5) 我添加了这样的日志语句:

Step 5) I've added logging statements like this:

logger.Info("This is a test.");

<小时>

-------------------------------------问题------------------------------------

<小时>

现在,我收到的错误表明我有多个 configSections 元素:一个在服务应用程序中,另一个在测试应用程序中.

log4net:ERROR Exception while reading ConfigurationSettings. Check your .config file is well formed XML.
System.Configuration.ConfigurationErrorsException: Configuration system failed to initialize ---> System.Configuration.ConfigurationErrorsException: Only one <configSections> element allowed per config file and if present must be the first child of the root <configuration> element. (C:\Users\pdl\Documents\Visual Studio 2013\Projects\WeatherAppService\WeatherAppTests\bin\Debug\WeatherAppTests.dll.config line 9)

但如果我从测试应用程序中删除 configSections,我会收到此错误:

log4net:ERROR Exception while reading ConfigurationSettings. Check your .config file is well formed XML.
System.Configuration.ConfigurationErrorsException: Configuration system failed to initialize ---> System.Configuration.ConfigurationErrorsException: Unrecognized configuration section log4net. (C:\Users\pdl\Documents\Visual Studio 2013\Projects\WeatherAppService\WeatherAppTests\bin\Debug\WeatherAppTests.dll.config line 7)

<小时>

-------------------------------------问题------------------------------------

<小时>

有谁知道如何设置 log4net,以便我可以运行单元测试,它运行服务应用程序并写入我的日志文件?或者,鉴于我所做的一切,有人可以告诉我什么是不正确或不完整的吗?


-------------------------------------Question------------------------------------


Does anybody know how to set up log4net, so I can run the unit test, which runs the service app and get my log files written to? Or, given everything I have done, can someone please tell me what is incorrect or incomplete?

推荐答案

该错误是因为,configSection 应该是配置文件中 之后的第一个元素.<代码><配置><configSections><section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,Log4net"/></configSections>

The error is because, configSection should be the first element after <Configuration> in the config file. <configuration> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,Log4net"/> </configSections>

元素指定配置和处理程序声明,因此它必须是

<ConfigSections> element specifies the configuration and handler declaration, so this must be the first child of <Configuration>

这篇关于一个解决方案中的项目和单元测试的 log4net 配置的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆