Вопрос

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

В новом консольном приложении, использующем 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 без добавления атрибута assembly или вызова в Main.Может ли кто-нибудь заверить меня, что мне это не почудилось?
  2. Может кто-нибудь, пожалуйста, указать мне, где в документе явно указано, что требуются как раздел конфигурации, так и хук инициализации - надеюсь, с объяснением того, когда это изменилось, если это произошло?

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

Это было полезно?

Решение

Согласно страница настройки в руководстве пользователя:

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

Атрибут XmlConfiguratorAttribute:Тот самый log4net.Config.XmlConfiguratorAttribute Позволяет XmlConfigurator настраивается с использованием следующих свойств:

  • Конфигурационный файл ...
  • Расширение конфигурационного файла ...

Если ни одно из свойств 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 так, как вы хотите.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top