Owin Logging Middleware

Owin ist eine interessante Sache um Web-Anwendungen zu schreiben, die von beliebigen .NET basierenden Webservern gehostet werden können. Eine Einschränkung auf den IIS ist nicht gegeben (was dann auch diverse Handler-Implementierungen betrifft). Ich setze in der letzten Zeit auf Owin, zumal ich immer seltener via IIS hoste und mir auch eben diese Abhängigkeit nicht gefällt.

Die öffentliche Definition von Owin lautet:

OWIN defines a standard interface between .NET web servers and web applications. The goal of the OWIN interface is to decouple server and application, encourage the development of simple modules for .NET web development, and, by being an open standard, stimulate the open source ecosystem of .NET web development tools.

Owin unterstützt hier die Möglichkeit in die Request Pipeline einzugreifen, nennen wir es die Owin Middleware. Als Basis-Klasse steht OwinMiddleware zur Verfügung.

In meinem Fall wollte ich über log4net Informationen über Request als auch Response loggen. Die Implementierung ist nachfolgend zu sehen.

Zu beachten ist, dass die Klasse LogFactory eine eigene Implementierung darstellt und lediglich log4net kapselt.

internal class RequestLoggerMiddleware : OwinMiddleware
{
    // LogFactory is a fluent implemention of log4net
    private readonly Log log = LogFactory.Create(typeof (RequestLoggerMiddleware));

    public RequestLoggerMiddleware(OwinMiddleware next)
        :base(next)
    {
    }

    public override async Task Invoke(IOwinContext context)
    {
        var method = string.Empty;
        var path = string.Empty;
        var statusCode = string.Empty;

        // Request
        if (context.Request != null)
        {
            method = context.Request.Method;
            path = context.Request.Path.ToString();
        }

        log.WithMessage(string.Format("METHOD: {0} - PATH: {1}", method, path)).AsDebug();

        // Invoking everything else
        await Next.Invoke(context);

        // Response
        if (context.Response != null)
        {
            statusCode = context.Response.StatusCode.ToString();
        }

        log.WithMessage(string.Format("METHOD: {0} - PATH: {1} - STATUSCODE: {2}", method, path, statusCode)).AsDebug();
    }
}

In Startup für Owin muss die Middleware noch konfiguriert werden:

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        var config = new HttpConfiguration();

        // defines routes
        // define filters

        app.Use<RequestLoggerMiddleware>();

        app.UseWebApi(config);

        // do other important stuff
    }
}

Dieses Prinzip kann natürlich einfach auf unterschiedlichste Anforderungen angewandt werden.

Veröffentlicht von Norbert Eder

Ich bin ein leidenschaftlicher Softwareentwickler. Mein Wissen und meine Gedanken teile ich nicht nur hier im Blog, sondern auch in Fachartikeln und Büchern.

Schreibe einen Kommentar

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

Cookie-Einstellungen
Auf dieser Website werden Cookie verwendet. Diese werden für den Betrieb der Website benötigt oder helfen uns dabei, die Website zu verbessern.
Alle Cookies zulassen
Auswahl speichern
Individuelle Einstellungen
Individuelle Einstellungen
Dies ist eine Übersicht aller Cookies, die auf der Website verwendet werden. Sie haben die Möglichkeit, individuelle Cookie-Einstellungen vorzunehmen. Geben Sie einzelnen Cookies oder ganzen Gruppen Ihre Einwilligung. Essentielle Cookies lassen sich nicht deaktivieren.
Speichern
Abbrechen
Essenziell (1)
Essenzielle Cookies werden für die grundlegende Funktionalität der Website benötigt.
Cookies anzeigen