25

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

В свежем консольного приложения с использованием 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 ] 

Или явно в itialise его в Main():

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

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

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

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

ответ

27

по the configuration page in the manual:

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

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

  • CONFIGFILE ...
  • ConfigFileExtension ...

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

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

// 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 в как вы хотите.

+0

Все звучит довольно правдоподобно.Все еще ищут больше - я убежден, что видел вещи, выпущенные в файл журнала, без явного вызова XmlConfiguratorAttribute или XmlConfigurator.Configure. Кажется разумно последовательным, не работая в 1.2.10, а код через Reflector не предполагает, что есть какая-либо причина, по которой он работал бы без маркера или явного вызова. Может быть, я должен просто использовать NLog вместо этого, и не было бы ни одной из этих проблем: P –

+1

@Ruben - Почему вы переключились на другую структуру только потому, что вам нужно инициализировать log4net? –

+1

@Peter Lillevold: У меня нет такого намерения, не знаю, где вы получили эту идею? Мне просто интересно понять, как я когда-либо думал, что он может работать без какой-либо явной конфигурации либо через Атрибут, либо по вызову Configurator.Configure ...? –