it-swarm.com.de

Richtige Verwendung von log4net (Logger-Benennung)

Es gibt zwei Möglichkeiten, log4net zu konfigurieren und zu verwenden. Zum einen kann ich meinen eigenen Appender und den dazugehörigen Logger konfigurieren:

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

Und wenn ich etwas im Protokoll schreiben möchte, kann ich Folgendes tun:

ILog log = LogManager.GetLogger("myLog");
log.Info("message");

Sie können root auch so konfigurieren, wie ich es möchte:

<!-- language: xml -->

<root>
    <level value="Error" />
    <appender-ref ref="myLogAppender" />
</root>

Und in diesem Fall kann ich Nachrichten wie folgt protokollieren:

ILog log = LogManager.GetLogger(typeof(Bar));
log.Info("message");

Der zweite Ansatz hat den Vorteil, dass Sie einige Nachrichten spontan aktivieren oder deaktivieren können. Aber das Problem ist, dass ich in EPiServer CMS entwickle und es ein eigenes Protokollierungssystem gibt, das log4net verwendet. Wenn ich die Protokollierung von Informationen auf Root-Ebene aktiviere, werden viele Systemprotokolle geschrieben. 

Wie nutzen Sie log4net? Jeder Teil eines Systems schreibt in seinen eigenen Logger oder alles wird in den Standard-Logger geschrieben, und die Konfiguration entscheidet, was als Nächstes zu tun ist. 

77
Sly

In Bezug auf die Protokollierung von Nachrichten innerhalb des Codes würde ich mich für den zweiten Ansatz entscheiden:

ILog log = LogManager.GetLogger(typeof(Bar));
log.Info("message");

Nachrichten, die an das obige Protokoll gesendet werden, werden mit dem vollständig qualifizierten Typ Bar benannt, z.

MyNamespace.Foo.Bar [INFO] message

Der Vorteil dieses Ansatzes ist der De-facto-Standard für das Organisieren der Protokollierung. Außerdem können Sie Ihre Protokollnachrichten nach Namespace filtern. Sie können beispielsweise angeben, dass Sie eine Nachricht auf INFO-Ebene protokollieren möchten, die Protokollierungsstufe für Bar jedoch speziell auf DEBUG erhöhen:

<log4net>
    <!-- appenders go here -->
    <root>
        <level value="INFO" />
        <appender-ref ref="myLogAppender" />
    </root>

    <logger name="MyNamespace.Foo.Bar">
        <level value="DEBUG" />
    </logger>
</log4net>

Die Möglichkeit, Ihre Protokollierung über den Namen zu filtern, ist eine leistungsstarke Funktion von log4net. Wenn Sie einfach alle Ihre Nachrichten in "myLog" protokollieren, verlieren Sie viel von dieser Leistung!

In Bezug auf den EPiServer-CMS sollten Sie in der Lage sein, den obigen Ansatz zu verwenden, um eine andere Protokollierungsstufe für den CMS und Ihren eigenen Code festzulegen.

Zur weiteren Lektüre hier ein Artikel über ein Codeprojekt, das ich zum Logging geschrieben habe:

92
ColinE

Meine Antwort könnte zu spät kommen, aber ich denke, es kann Neulingen helfen. Sie sehen keine Protokolle, die ausgeführt werden, es sei denn, die Änderungen werden wie folgt vorgenommen.

2 Dateien müssen geändert werden, wenn Sie Log4net implementieren.


  1. Fügen Sie im Projekt einen Verweis auf log4net.dll hinzu.
  2. app.config
  3. Class -Datei, in der Sie Protokolle implementieren.

In [app.config]:

Zuerst müssen Sie unter 'configSections' den folgenden Code hinzufügen.

<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />

Dann müssen Sie unter "Konfiguration" den folgenden Code schreiben (dieser Code wird an meine Bedürfnisse angepasst, funktioniert aber wie ein Zauber.)

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

Innerhalb Aufrufende Klasse:

Innerhalb der Klasse, in der Sie dieses log4net verwenden werden, müssen Sie den folgenden Code angeben.

 ILog log = LogManager.GetLogger("log");

Jetzt sind Sie bereit, Anrufprotokolle an jedem beliebigen Ort in derselben Klasse aufzurufen. Nachfolgend finden Sie eine Methode, die Sie während des Vorgangs aufrufen können.

log.Error("message");
8
Ankur Soni

Anstatt meine aufrufende Klasse zu benennen, begann ich Folgendes zu verwenden:

private static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

Auf diese Weise kann ich in jeder Klasse, die log4net verwendet, dieselbe Codezeile verwenden, ohne beim Codieren und Einfügen von Code daran denken zu müssen .. .. Alternativ könnte ich auch eine Protokollklasse erstellen und jede andere Klasse erben meine Protokollierungsklasse.

4
Agent RhoShambo

Nachteil des zweiten Ansatzes ist ein großes Repository mit erstellten Loggern. Diese Logger machen dasselbe, wenn root definiert ist und Klassenlogger nicht definiert sind. Das Standardszenario im Produktionssystem verwendet wenige Logger, die für Klassengruppen bestimmt sind. Entschuldigung für mein Englisch. 

0
user1785960