Logging mit log4net

Veröffentlicht von

Eine kleine Einführung in Log4net. Logging gehört zu den Dingen, bei denen das Rad gerne neu erfunden wird. Ich habe bis jetzt auch immer meine eigenen Logging-Funktionen verwendet. Sinnvoll ist das nicht, es ist ein gelöstes Problem und von anderen bereits besser gelöst, als ich es kann.

Log4net hat viele Funktionen, im Beispiel beschränke ich mich auf Logging in eine Datei. Dies ist der Use-Case für meine Anwendungsfälle.

Installation von log4net

Log4net kann einfach über die NuGet-Konfiguration für das Projekt installiert werden.

Nach der Installation konfigurieren wir log4net für unser Projekt, dazu legen wir eine Textdatei an:

In dieser legen wir die Konfiguration fest:

<log4net>
  <root>
    <level value="ALL" />
    <appender-ref ref="console" />
    <appender-ref ref="file" />
  </root>
  <appender name="console" type="log4net.Appender.ConsoleAppender">
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date %level %logger - %message%newline" />
    </layout>
  </appender>
  <appender name="file" type="log4net.Appender.RollingFileAppender">
    <file value="app.log" />
    <appendToFile value="true" />
    <rollingStyle value="Size" />
    <maxSizeRollBackups value="5" />
    <maximumFileSize value="10MB" />
    <staticLogFileName value="true" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%thread] %level %logger - %message%newline"  />
    </layout>
  </appender>
</log4net>

In der XML-Datei werden die LogAppender festgelegt, also wohin geloggt werden soll, welche Meldungen und wie das Log-File aussehen wird. In unserem Beispiel gibt es zwei Logger, einmal die Console und einmal in eine Textdatei. Ebenfalls legen wir die Größe der Log-Datei an, das Format einer Meldung etc. Die Details kann man auf der log4net Seite herauslesen.

Die Konfigurationsdatei muss beim Build ins Ausgabeverzeichnis kopiert werden:

Damit unsere Anwendung die Konfiguration verwendet, fügen wir am Ende der “AssemblyInfo.cs” Datei noch folgende Zeile ein:

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config")]

Verwendung des Logger

Um den Logger zu verwenden, müssen wir diesen einbinden:

using log4net;

In der jeweiligen Klasse können wir den Logger für die Verwendung so deklarieren:

protected static readonly log4net.ILog _log =  
log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

Dies gibt dem Logger gleich den richtige Namen und wir können mit dem Logging loslegen:

_log.Warn("Dies ist eine Warnuing");

Das Ergebnis sehen wir im Logfile:

Das Logfile liegt gemäß unserer Konfiguration im Programmverzeichnis.

Verwenden Bibliotheken ebenfalls das log4net Framework, so übernehmen diese die Konfiguration des Hauptprogramms, so dass auch diese Lognachrichten in unsere Datei schreiben.

Logfiles anschauen

Das Anschauen der Logfiles funktioniert mit jedem Texteditor oder purischen Tools wie “tail”. Da Logging schnell umfangreich wird, wenn jede Menge Programmteile protokollieren, schafft spezielle Software Abhilfe.

Log4view ist so eine Software, welche es z.B. ermöglicht nach verschiedenen Loggern zu filtern, suchen. Die Basis-Version ist zudem kostenlos. Eine weitere Alternative ist YALV!, welches XML-Log-Dateien benötigt. Beispielcode im Download-Projekt.

Logfile Position dynamisch festlegen

Bis jetzt haben wir die Log-Datei immer im Programmverzeichnis abgelegt, dies ist für die Entwicklung OK, aber im Produktivbetrieb ist das nicht zweckführend. Hier sollte die Log-Datei z.B. im AppData Verzeichnis abgelegt werden. Hierzu möchten wir zur Laufzeit die Position festlegen.

Dazu ersetzen wir in der Konfigurationsdatei die Zeile:

<file value="app.log" />

durch:

<file type="log4net.Util.PatternString" value="%property{LogFile}.log" />

Wie man sieht, gegen wir hier ein “Property” an, mit dem Namen “Logfile”. Dieses Property können wir jetzt zur Laufzeit setzen:

String logFileName = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
logFileName = System.IO.Path.Combine(logFileName, "log");

log4net.GlobalContext.Properties["LogFile"] = logFileName;
string s = new  Uri(Path.Combine(System.IO.Path.GetDirectoryName(System.Reflection.Assembly.
                GetExecutingAssembly().CodeBase), "log4net.config")).LocalPath;
log4net.Config.XmlConfigurator.Configure(new FileInfo(s));

Dies sollte vor den ersten Log-Ausgaben erfolgen, z.B. in der “Program.cs”.

Das Log-File wird nun in dem festgelegten Pfad abgelegt.

Download Beispielprojekt (Visual Studio 2017)

LoggingExample

Das Beispielprojekt gibt es hier zum Download. Vor dem Start müssen die NuGet-Packages wiederhergestellt werden:

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.