Logging mit log4net in .NET Projekten

Am Wochenende habe ich aus meinem Ausbildungsprojekt ein paar „Jugendsünden“ entfernen müssen und wollte in diesem Zusammenhang gleich das mir schon aus Java bekannte log4j in VB.NET integrieren. Eine passende Implementierung für .NET wird von Apache Foundation unter dem Namen log4net angeboten, doch leider ist die Dokumentation sehr dürftig. Da ich im Netz auch keine passende Beschreibung gefunden habe und mir die Informationen aus zig Quellen zusammensuchen musste, gebe ich nun hier eine kleine Anleitung für die Integration von log4net in .NET Projekte.

Für das Verständnis des Artikels setze ich die allgemeine Kentniss von log4net voraus, ebenso ein wenig Grundverständnis für Microsofts Visual Studio.

Download der Sourcen

Apache stellt freundlicherweise die Sourcen direkt auf ihrer Webseite zum Download zur Verfügung. Im Moment ist die Version 1.2.10 aktuell.

Installation

Kurz gesagt: Es ist keine Installation von log4net notwendig. Es genügt das heruntergeladene ZIP-Archiv an einen beliebigen Ort der Festplatte zu entpacken. Die wichtigste Datei in dem Zip ist die log4net DLL die hier lokalisiert ist: „D:\log4net-1.2.10\bin\net\2.0\release\log4net.dll

Integration

Nun kann man schon seine Entwicklungsumgebung starten, in meinem Fall Visual Studio 2008. Per Rechtsklick auf sein Projekt kann man über „Add Reference“ einen Dialog öffnen und dort über den Tab „Browse“ seine log4net.dll Datei aus dem o.g. auswählen. Im Normalfall müsste die log4net.dll nun unter „Detected Dependencies“ auftauchen und die Basis zum Arbeiten mit log4net wäre fast erledigt.

Konfiguration

Als nächstes wird die Konfigurationsdatei für log4net noch benötigt. Über Rechtsklick auf dem Projekt und „Add“ -> „New Item“ kann man aus dem Unterpunkt „General“ ein neues „Application Configuration File“ auswählen. In diesem Configuration File werden nun die Einstellungen für log4net vorgenommen, etwa wohin eine Log Datei geschrieben wird und auf welchem Level geloggt werden soll. Der Inhalt der Datei kann erstmal gelöscht werden und durch nachfolgenden ersetzt werden.

Als Grundfunktion definiere ich einen „FileAppender“ der seine Ausgaben in eine Log-Datei schreiben soll. Diesen Appender nenne ich passender Weise „LogFileAppender“  und lasse ihn in die Datei „C:\error-log.txt“ schreiben. Beachtet bitte bei der Pfadangabe die doppelten Slashes bei Verzeichnisangaben.

Mit der Angabe des Appenders im <root> Block definieren wir den Appender als Standard Appender für Logausgaben.

[code language=“xml“]
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net"
type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections>
<log4net debug="false">
<appender name="LogFileAppender" type="log4net.Appender.FileAppender,log4net">
<param name="File" value="C:\error-log.txt" />
<param name="AppendToFile" value="true" />
<layout type="log4net.Layout.PatternLayout,log4net">
<param name="ConversionPattern" value="%d %-5p %c %m%n" />
</layout>
</appender>
<root>
<priority value="ALL" />
<appender-ref ref="LogFileAppender" />
</root>
<category name="testApp.LoggingExample">
<priority value="ALL" />
</category>
</log4net>
</configuration>
[/code]

Somit wäre auch die Konfiguration erledigt und wir können nun im Code mit log4net arbeiten

Using log4net

Es ist Geschmackssache ob man eine globale Log-Instanz erstellen möchte oder jeder seiner Klassen eine eigene Log Instanz spendiert. Ich bevorzuge immer zweiteres, da das Logging so noch ein Stück genauer wird.

Wir instanzieren uns ein neues log4net Objekt:

[code language=“vb“]
Dim logger As log4net.ILog = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType)
[/code]

Wichtig ist, dass wir vor der Benutzung unseres loggers dafür sorgen, dass die Konfiguration eingelesen wird. Beispielsweise im Konstruktor. Macht man das nicht, bleibt die Ausgabe(datei) leer.

[code language=“vb“]
log4net.Config.XmlConfigurator.Configure()
[/code]

Das wars.

Von nun an kann man in seinem Code bequem mit log4net arbeiten und schöne Logausgaben erzeugen.

[code language=“vb“]
If logger.IsDebugEnabled Then
logger.Debug("Eine Debug Ausgabe von iCounter=" + iCounter)
End If

If logger.IsInfoEnabled Then
logger.Info("Starte Kommunikation mit Webservice")
End If

logger.Warn("Es wurde kein Standard-Value definiert")
logger.Error("Der Webservice antwortet nicht")
logger.Fatal("Fehler beim Aufbau der Datenbankverbindung, Param=" + p)

[/code]

Quellen

Bei meinen Recherchen haben mir folgende Quellen geholfen: