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?

Author: Sly, 2011-08-17

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:

 96
Author: ColinE,
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.


  1. Dodaj odniesienie do log4net.dll w projekcie.
  2. app.config
  3. 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");
 12
Author: Ankur Soni,
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.

 6
Author: Agent RhoShambo,
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.

 0
Author: user1785960,
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