Нет логинга и корень хранилища имеет appender, но Logger не имеет appender - PullRequest
0 голосов
/ 18 октября 2018

Я уверен, что мне не хватает чего-то простого.Я пытаюсь включить ведение журнала 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 не имеет никаких дополнений.

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

enter image description here

РЕДАКТИРОВАТЬ: Этоэто то, что я пропустил, как определено из ответа ZRT:

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

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

1 Ответ

0 голосов
/ 18 октября 2018

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");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...