инициализация log4net - PullRequest
       31

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

28 голосов
/ 11 августа 2009

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

В новом консольном приложении, использующем 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");

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

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

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

1 Ответ

29 голосов
/ 11 августа 2009

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

Конфигурация 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 в так, как вы хотите.

...