Подтвердить что ты не робот

Инициализация log4net

Я искал дубликаты, но должен спросить следующее, независимо от того, как это может показаться, чтобы понять это раз и навсегда!

В новом приложении Console, использующем log4net версии 1.2.10.0 на VS28KSP1 на 64-битной версии W7, у меня есть следующий код: -

using log4net;
using log4net.Config;

namespace ConsoleApplication1
{
    class Program
    {
        static readonly ILog _log = LogManager.GetLogger(typeof(Program));
        static void Main(string[] args)
        {
            _log.Info("Ran");
        }
    }
}

В моем app.config у меня есть:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
  </configSections>
  <log4net>
    <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
      <file value="Program.log" />
      <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
      <appendToFile value="true" />
      <rollingStyle value="Size" />
      <maxSizeRollBackups value="10" />
      <maximumFileSize value="1MB" />
      <staticLogFileName value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="[%username] %date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
      </layout>
    </appender>

    <root>
      <level value="DEBUG" />
      <appender-ref ref="RollingFileAppender" />
    </root>
  </log4net>

</configuration>

Это ничего не пишет, если я не добавлю атрибут:

[ assembly:XmlConfigurator ]

Или явно инициализировать его в Main():

_log.Info("This will not go to the log");
XmlConfigurator.Configure();
_log.Info("Ran");

Это вызывает следующие вопросы:

  • Я почти уверен, что видел, как он работает где-то на некоторой версии log4net без добавления атрибута сборки или вызова в Main. Может кто-нибудь заверить меня, что я этого не воображаю?
  • Может ли кто-нибудь указать мне, где в документе явно указано, что требуются как секция конфигурации, так и инициализационный крючок - надеюсь, с объяснением, когда это изменилось, если бы это произошло?

Я могу с легкостью понять, почему это может быть политикой - с явным шагом инициализации, чтобы избежать сюрпризов и т.д., я просто помню, что это не всегда так... (И обычно у меня есть конфиг в отдельный файл, который обычно принимает конфигурацию из изображения)

4b9b3361

Ответ 1

Согласно странице конфигурации в руководстве:

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

XmlConfiguratorAttribute: log4net.Config.XmlConfiguratorAttribute Позволяет настроить XmlConfigurator, используя следующие свойства:

  • ConfigFile...
  • ConfigFileExtension...

Если ни один из свойств ConfigFile или ConfigFileExtension не указан, файл конфигурации приложения (например, TestApp.exe.config) будет использоваться в качестве файла конфигурации log4net.

Пример использования:

// Configure log4net using the .config file
[assembly: log4net.Config.XmlConfigurator(Watch=true)]
// This will cause log4net to look for a configuration file
// called TestApp.exe.config in the application base
// directory (i.e. the directory containing TestApp.exe)
// The config file will be watched for changes.

Я согласен, что это немного неоднозначно, но я интерпретирую существование использования примера для обозначения того, что log4net не будет использовать файл .config без указанного выше атрибута; и тот факт, что они указывают, что вы должны использовать одно из двух свойств, но ничего не говорите об исключении этого атрибута, предлагает мне, чтобы атрибут (или программный вызов) использовался для использования app.config в как вы хотите.