Poprawny sposób użycia log4net (Logger naming)
Istnieją dwa sposoby konfigurowania i używania log4net. Po pierwsze, mogę skonfigurować własny appender i powiązany z nim logger:
<!-- language: xml -->
<appender name="myLogAppender" type="log4net.Appender.RollingFileAppender" >
<file value="Logs\myLog.log" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date %level - %message%n" />
</layout>
</appender>
<logger name="myLog">
<level value="All"></level>
<appender-ref ref="myLogAppender" />
</logger>
A kiedy chcę coś napisać w logu, mogę zrobić co następuje:
ILog log = LogManager.GetLogger("myLog");
log.Info("message");
Innym sposobem użycia jest skonfigurowanie roota tak, aby był tak szczegółowy, jak chcę:
<!-- language: xml -->
<root>
<level value="Error" />
<appender-ref ref="myLogAppender" />
</root>
I w tym przypadku mogę rejestrować takie wiadomości:
ILog log = LogManager.GetLogger(typeof(Bar));
log.Info("message");
Korzyści z drugiego podejścia jest to, że można włączyć lub wyłączyć niektóre wiadomości na mucha. Ale problem polega na tym, że rozwijam się w EPiServer CMS i ma swój własny system logowania, który używa log4net i jeśli włączę rejestrowanie informacji na poziomie roota, wtedy wiele logów systemowych zostanie zapisanych.
Jak korzystać z log4net? Każda część systemu zapisuje się w swoim własnym loggerze, lub wszystko jest zapisane w domyślnym loggerze, a konfiguracja decyduje co dalej?
4 answers
Jeśli chodzi o sposób logowania wiadomości w kodzie, wybrałbym drugie podejście:
ILog log = LogManager.GetLogger(typeof(Bar));
log.Info("message");
Gdzie wiadomości wysyłane do dziennika powyżej będą "nazwane" za pomocą w pełni kwalifikowanego typu Bar
, np.
MyNamespace.Foo.Bar [INFO] message
Zaletą tego podejścia jest to, że jest de facto standardem organizacji logowania, pozwala również filtrować wiadomości dziennika według przestrzeni nazw. Na przykład, możesz określić, że chcesz logować wiadomość o poziomie informacji, ale podnieść poziom logowania dla Bar
specjalnie do DEBUG:
<log4net>
<!-- appenders go here -->
<root>
<level value="INFO" />
<appender-ref ref="myLogAppender" />
</root>
<logger name="MyNamespace.Foo.Bar">
<level value="DEBUG" />
</logger>
</log4net>
Możliwość filtrowania logowania za pomocą nazwy jest potężną funkcją log4net, jeśli po prostu logujesz wszystkie wiadomości do "myLog"
, tracisz wiele z tej mocy!
Jeśli chodzi o EPiServer CMS, powinieneś być w stanie użyć powyższego podejścia, aby określić inny poziom logowania dla CMS i własnego kodu.
Aby przeczytać dalej, oto artykuł codeproject, który napisałem po zalogowaniu:
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-23 11:30:39
Moja odpowiedź może przyjść późno, ale myślę, że może pomóc newbie. Nie zobaczysz logów wykonanych, chyba że zmiany zostaną wprowadzone jak poniżej.
2 Pliki muszą zostać zmienione podczas implementacji Log4net.
- Dodaj odniesienie do log4net.dll w projekcie.
- app.config
- klasa plik, w którym zaimplementujesz Logi.
Wewnątrz [app.config] :
Najpierw pod 'configSections', musisz dodać poniższy fragment kodu;
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
Następnie, w bloku 'konfiguracja', musisz napisać poniżej fragment kodu.(Ten kawałek kodu jest dostosowany zgodnie z moimi potrzebami, ale działa jak urok.)
<log4net debug="true">
<logger name="log">
<level value="All"></level>
<appender-ref ref="RollingLogFileAppender" />
</logger>
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="log.txt" />
<appendToFile value="true" />
<rollingStyle value="Composite" />
<maxSizeRollBackups value="1" />
<maximumFileSize value="1MB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date %C.%M [%line] %-5level - %message %newline %exception %newline" />
</layout>
</appender>
</log4net>
Wewnątrz Wywołanie Klasy :
Wewnątrz klasy, w której zamierzasz używać log4net, musisz zadeklarować poniższy fragment kodu.
ILog log = LogManager.GetLogger("log");
Teraz, jesteś gotowy dziennik połączeń gdziekolwiek chcesz w tej samej klasie. Poniżej znajduje się jedna z metod, które możesz zadzwoń podczas wykonywania operacji.
log.Error("message");
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-22 21:50:39
Zamiast nazywać moją klasę wywołującą, zacząłem używać następującego:
private static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
W ten sposób mogę używać tej samej linii kodu w każdej klasie, która używa log4net bez konieczności pamiętania o zmianie kodu podczas kopiowania i wklejania. Alternatywnie, mogę utworzyć klasę logging, a każda inna klasa dziedziczy z mojej klasy logging.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-28 16:02:35
Wadą drugiego podejścia jest duże repozytorium z utworzonymi loggerami. Rejestratory te robią to samo, jeśli jest zdefiniowany root i nie są zdefiniowane rejestratory klas. Standardowo w systemie produkcyjnym stosuje się kilka loggerów dedykowanych do grupy klas. Przepraszam za mój angielski.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-09 08:23:06