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:
- 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?
- 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)
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 –
@Ruben - Dlaczego przestawiłeś się na inną platformę tylko dlatego, że musisz zainicjować log4net? –
@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 ...? –