25

Starałem się wyglądać na duplikaty, ale muszę zadać następujące pytania, bez względu na to, jak podstawowe może się wydawać, aby raz na zawsze je wyjaśnić!Inicjalizacja log4net

w świeżej app konsoli przy użyciu log4net wersji 1.2.10.0 na VS28KSP1 w 64-bitowym W7, mam następujący kod: -

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"); 
     } 
    } 
} 

W moim app.config, mam:

<?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> 

To nic nie zapisuje, chyba że dodam atrybut:

[ assembly:XmlConfigurator ] 

Lub bezpośrednio w itialise go w main():

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

To rodzi następujące pytania:

  1. jestem prawie pewien, że widziałem go pracy gdzieś na jakiejś wersji log4net bez dodawania atrybutu montażowej lub zadzwoń na Main. Czy ktoś może mnie zapewnić, że ja tego nie wyobrażam?
  2. Czy ktoś może wskazać mi dokąd w dokumencie wyraźnie stwierdza, że ​​zarówno sekcja konfiguracji, jak i inicjalizacja są wymagane - mam nadzieję, z wyjaśnieniem, kiedy to się zmieniło, jeśli tak?

Mogę łatwo sobie wyobrazić, dlaczego to może być polityka - mając krok inicjalizacji jednoznacznie, aby uniknąć niespodzianek itp., Wydaje mi się, że nie zawsze tak jest ... (I zwykle mam config w oddzielnym pliku, które na ogół trwa configSections na rysunku)

Odpowiedz

27

Według the configuration page in the manual:

konfiguracja log4net można skonfigurować za pomocą zespołu poziomie atrybutów niż określona programowo.

XmlConfiguratorAttribute: The log4net.Config.XmlConfiguratorAttribute Pozwala XmlConfigurator być skonfigurowany przy użyciu następujących właściwości:

  • configfile ...
  • ConfigFileExtension ...

Jeśli żadna z configfile lub właściwości ConfigFileExtension są określone, plik konfiguracyjny aplikacji (np. TestApp.exe.config) będzie używany jako plik konfiguracyjny log4net.

Przykład użycia:

// 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. 

Zgadzam się, że jest to nieco dwuznaczne, ale ja interpretować istnienie użytkowania przykład oznaczać, że log4net nie użyje pliku .config bez powyższego atrybutu; i fakt, że wskazują one, że musisz użyć jednej z dwóch właściwości, ale nie mówią nic o całkowitym pominięciu atrybutu, sugeruje mi, że atrybut (lub wywołanie programowe) jest wymagany do użycia app.config w sposób, w jaki chcesz.

+0

Wszystkie dźwięki są dość wiarygodne.Ciągle jednak szukam - jestem przekonany, że widziałem rzeczy emitowane do pliku dziennika bez wyraźnego wywołania XmlConfiguratorAttribute lub XmlConfigurator.Configure. Wydaje się rozsądnie spójne, nie działające w wersji 1.2.10, a kod za pomocą Reflectora nie sugeruje, że istnieje jakikolwiek powód, dla którego mógłby działać bez znacznika lub jawnego wywołania. Być może powinienem po prostu użyć NLog zamiast, i nie byłoby żadnego z tych problemów: P –

+1

@Ruben - Dlaczego przestawiłeś się na inną platformę tylko dlatego, że musisz zainicjować log4net? –

+1

@Peter Lillevold: Nie mam takich zamiarów, nie jestem pewien, skąd wziąłeś pomysł? Po prostu interesuje mnie zrozumienie, w jaki sposób doszedłem do wniosku, że możliwe jest, aby działał bez jakiejkolwiek formy jawnej konfiguracji za pomocą Atrybutu lub połączenia z Configurator.Configure ...? –