Выход log4net не появляется в некоторых тестах - как работать?

У меня есть 100 единиц модульных тестов. Большая часть моих протоколов работает отлично (т. Е. Появляется в окне вывода ReSharper и VS test runner). Однако, очень странно, некоторые тесты настойчиво не записываются в окно вывода с использованием log4net (видимо, из-за 0 добавок). Я отследил его до частного регистрационного поля в ссылочном классе.

Почему присутствие частного поля Logger в одном классе (например, FooA) прерывает ведение журнала в другом тестовом классе (например, FooOtherTest)? Это просто ошибка в log4net? Каков механизм действия? (так что я могу избежать этого или обходным путем ... потому что очень сложно отслеживать код, когда это происходит из-за уровней косвенности).

Эти 2 файла находятся в двух разных проектах (проект библиотеки классов и тестовый проект). В тестовом проекте есть файл log4net.config. W / Build Action = Content и Copy to Output Directory = Копировать всегда.

VS2017 Enterprise Version 15.7.4, log4net 2.0.8.0, C # 4.7.1

введите описание изображения здесь

Вот иллюстрация того, что это происходит в Visual Studio Test Explorer. введите описание изображения здесь

Вот код:

 using log4net;

 namespace FooBug
 {
    public static class FooA
    {
        // toggle to see symptom come and go (excluded = works fine, included = logging in test class fails)
        //private static readonly ILog Logger = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
        public static readonly int fooA = 4;
    }
}

using System;
using FooBug;
using log4net;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace OtherTest
{
    [TestClass]
    public class FooOtherTest
    {
        private static readonly ILog Logger = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

        private static readonly int fooA = FooA.fooA;

        [TestMethod]
        public void Test0()
        {
            Console.WriteLine(@"sanity check to console");
            Logger.Debug("SUCCESS - the logging works right now");

            ConsoleWriteAppenders();
        }

        public static void ConsoleWriteAppenders()
        {
            var appenders = LogManager.GetRepository().GetAppenders();
            Console.WriteLine("appenders.Length = " + appenders.Length);

            foreach (var appender in appenders)
            {
                Console.WriteLine(appender.Name);
            }
        }

    }
}

c#,log4net,

0

Ответов: 2


1 принят

Это просто ошибка в log4net?

Если то, что я думаю, происходит правильно, тогда это документированное поведение.

См. Https://logging.apache.org/log4net/release/faq.html#first-log

Если вы настраиваете log4net, указав атрибуты уровня сборки на своей сборке, тогда конфигурация будет загружена после первого вызова LogManager.GetLogger. Необходимо, чтобы первый вызов LogManager.GetLogger, выполненный во время процесса (или AppDomain), был сделан из сборки, которая имеет атрибуты конфигурации. Log4net будет выглядеть только один раз и только на первой вызывающей сборке для атрибутов конфигурации.

Я подозреваю, что это связано с тем, что FooOtherTest зависит от FooA и поэтому сначала будет загружаться dll, и, следовательно, регистратор будет инициализирован из этой DLL и не найдет конфигурацию, которая находится в тестовом проекте.

Вам нужно попытаться убедиться, что первое ведение журнала происходит в сборке с правильными атрибутами и где можно найти файл конфигурации.

См. Также Инициализировать log4Net как можно раньше с помощью NUnit (речь идет о NUnit, но большинство тестовых систем имеют нечто похожее)


0

@sgmoore Правильно. Следующее решение, которое я выбрал, состояло в том, чтобы начать включать log4net.config во все проекты библиотеки классов (также нужна строка XmlConfigurator в AssemblyInfo.cs), хотя проекты библиотеки классов не имеют приложений или точек ввода тестов.

C #, log4net,
Похожие вопросы