Нет журналирования, и в корне репозитория есть приложение, но у Logger нет приложения

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

Я пробовал указать конфигурацию журнала, используя как конфигурационный файл, так и программно:

Файл конфигурации:

 <log4net>
  <root>
    <level value = "INFO" />
    <appender-ref ref = "console" />
    <appender-ref ref = "file" />
  </root>
  <appender name = "file" type = "log4net.Appender.RollingFileAppender">
    <file value = "mylog.log" />
    <appendToFile value = "true" />
    <rollingStyle value = "Size" />
    <maxSizeRollBackups value = "5" />
    <maximumFileSize value = "10MB" />
    <staticLogFileName value = "true" />
    <layout type = "log4net.Layout.PatternLayout">
      <conversionPattern value = "%date [%thread] %level %logger - %message%newline" />
    </layout>
  </appender>
</log4net>

Программно

    private void ConfigureAppender()
    {
        var layout = new PatternLayout("%date [%thread] %level %logger - %message%newline");
        var appender = new RollingFileAppender {Name = "file", File = "c:\\temp\\mylog.log", AppendToFile = true, RollingStyle = RollingFileAppender.RollingMode.Size, MaxSizeRollBackups = 5, MaximumFileSize = "10MB", StaticLogFileName = true, Layout = layout};
        var repository = LogManager.GetRepository() as Hierarchy;
        repository.Root.AddAppender(appender);
        repository.Root.Level = Level.Info;
        repository.Configured = true;
        repository.RaiseConfigurationChanged(EventArgs.Empty);
    }

Затем я получаю регистратор как можно раньше в процессе выполнения программы, используя что-то вроде этого (я тоже пробовал [assembly: XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]):

        var fileInfo = new FileInfo("log4net.config");
        if (!fileInfo.Exists) throw new Exception();
        XmlConfigurator.Configure(fileInfo);
        var log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
        log.Fatal("This is a test");

В любом случае журналов нет. Независимо от того, определяю ли я ведение журнала через конфигурацию или программно, я вижу снимок экрана внизу, когда проверяю объект журнала. Обратите внимание на следующее:

  1. Настройки уровня были взяты из определения конфигурации.
  2. В корне репозитория есть два дополнения, как определено в определении конфигурации.
  3. Сам экземпляр Logger не имеет добавлений.

Может кто-нибудь сказать мне, что мне не хватает?

Нет журналирования, и в корне репозитория есть приложение, но у Logger нет приложения

Обновлено: Это то, что я пропустил, как определено из ответа Z.R.T.:

  • Мне нужен был элемент logger в файле log4net.config / app.config.
  • Мне нужно было ссылаться на регистратор по имени, например LogManager.GetLogger("IntegrationLogger");.

Как только я добавил эти две вещи, log4net начал работать. Единственным недостатком является то, что все журналы помечены как «IntegrationLogger» вместо класса, в котором создается журнал, но это, по крайней мере, позволило начать ведение журнала.

Вы пробовали включение режима отладки log4net

stuartd 18.10.2018 01:03

У меня нет - отличный отзыв. День уже поздно, так что завтра я проверю это первым делом.

ket 18.10.2018 02:49

На самом деле я просто попробовал - скопировал содержимое дословно из ссылки, которую вы предоставили в моем app.config, переместил содержимое log4net в app.config и обновил экземпляр FileInfo, чтобы использовать app.config, запустил его и ... нет . Ни mylog.log, ни log4net.txt. :( Тем не менее, хорошее предложение.

ket 18.10.2018 03:06
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
965
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

log4net.config - установить копировать, если новее или копировать всегда

<log4net>
  <appender name = "SomeRollingLogFileAppender" type = "log4net.Appender.RollingFileAppender">
    <file value = "..\\logs\\loginfo.log" />
    <appendToFile value = "true" />
    <rollingStyle value = "Size" />
    <maxSizeRollBackups value = "5" />
    <maximumFileSize value = "10MB" />
    <staticLogFileName value = "true" />
    <layout type = "log4net.Layout.PatternLayout">
      <conversionPattern value = "%date [%thread] %level %logger - %message%newline" />
    </layout>
  </appender>
  <appender name = "console" type = "log4net.Appender.ConsoleAppender">
    <layout type = "log4net.Layout.PatternLayout">
      <conversionPattern value = "%date [%thread] %level %logger - %message%newline" />
    </layout>
  </appender>
  <logger name = "SomeLogger">
    <level value = "INFO" />
    <appender-ref ref = "SomeRollingLogFileAppender" />
    <appender-ref ref = "console" />
  </logger>
</log4net>

Log.cs

public class Log
{
    private static readonly ILog someLogger = LogManager.GetLogger("SomeLogger");
    static Log()
    {
        if (!UnitTestDetector.IsRunningFromNUnit)
        {
            XmlConfigurator.Configure(new FileInfo("log4net.config"));
        }
        else
        {
            var testDir = TestContext.CurrentContext.TestDirectory;
            XmlConfigurator.Configure(new FileInfo(Path.Combine(testDir,"log4net.config")));
        }
    }

    public static void Info(string msg)
    {
        someLogger.Info(msg);
    }
}

static class UnitTestDetector
{
    static UnitTestDetector()
    {
        foreach (Assembly assem in AppDomain.CurrentDomain.GetAssemblies())
        {
            if (assem.FullName.ToLowerInvariant().StartsWith("nunit.framework"))
            {
                IsRunningFromNUnit = true;
                break;
            }
        }
    }

    public static bool IsRunningFromNUnit { get; } = false;
}

Program.cs

[TestFixture]
class Program
{

    static void Main()
    {
        Log.Info("test");
        Console.ReadLine();
    }

    [Test]
    public void Test()
    {
        Log.Info("test");
    }
}

Это работает, теперь я вижу то, что упустил. Я обновлю свой вопрос с подробностями. Спасибо!

ket 18.10.2018 19:52

Другие вопросы по теме