log4net logger регистрирует непредвиденные уровни на основе конфигурации - PullRequest
0 голосов
/ 16 декабря 2018

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

У меня есть корневой регистратор, для которого установлен уровень INFO, и другой регистратор для определенного класса, для которого установлен уровень ERROR.

Я ожидал, что регистратор классов будет тольковойти в систему с ошибкой и игнорировать уровень корней, так как я установил аддитивность в false для регистратора классов.Вот log4net.config, который у меня есть на данный момент:

<?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 [%property{NDC}] - %message%newline" />
      </layout>
    </appender>

    <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
      <file value="log.txt" />
      <appendToFile value="true" />
      <rollingStyle value="Size" />
      <maxSizeRollBackups value="10" />
      <maximumFileSize value="100KB" />
      <staticLogFileName value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
      </layout>
    </appender>

    <logger name="EveStatic.Config.ViewModel" additivity="false">
      <level value="error"/>
      <appender-ref ref="ConsoleAppender"/>
      <appender-ref ref="RollingFileAppender"/>
    </logger>

    <root>
      <level value="debug" />
      <appender-ref ref="ConsoleAppender" />
      <appender-ref ref="RollingFileAppender" />
    </root>

  </log4net>
</configuration>

В моем AssemblyInfo.cs:

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]

И в классе, который загружает конфигурацию:

log4net.Config.XmlConfigurator.Configure(new FileInfo("log4net.config"));

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

Ожидается ли такое поведение, и я не понимаю переопределения конфигурации и уровня или я что-то забываю?

РЕДАКТИРОВАТЬ: Вот как я создаю экземпляр и вызываю ILog.Полное имя класса - это имя регистратора в конфигурации плюс ConfiInfoViewModel:

private static readonly ILog LOG = LogManager.GetLogger(typeof(ConfigInfoViewModel));
...
LOG.Debug("Something buggy");

Также обратите внимание, что при тестировании уровней ведения журналов у меня был оператор записи для каждого уровня в серии.

1 Ответ

0 голосов
/ 17 декабря 2018

Ваша проблема лежит здесь

LogManager.GetLogger(typeof(ConfigInfoViewModel));

Внутренне это разрешается до

LogManager.GetLogger(typeof(ConfigInfoViewModel).FullName);

Теперь log4net ищет Logger с именем "EveStatic.Config.ConfigInfoViewModel" (результатtypeof(ConfigInfoViewModel).FullName)

Поскольку Logger с таким именем не указано, используется новый с настройками по умолчанию.

Также обратите внимание, что level задает порог, а не один уровень.
Пример: level=warn означает log warn все уровни выше (error и fatal)

...