Sie sind hier: Weblog

Benutzerdefinierten Logger für ASP.NET 5 bereitstellen

Foto ,
06.03.2015 00:39:00

ASP.NET 5 bringt ein erweiterbares Logging-Konzept. Wer sich nicht mit den im Lieferumfang befindlichen Logger-Implementierungen zufrieden geben möchte, kann damit auch ohne großen Aufwand einen eigenen Logger implementieren. Dazu ist zunächst das Interface ILogger zu realisieren:

using Microsoft.Framework.Logging;
using System;

namespace FlugDemo.Logging
{
    public class CustomLogger : ILogger
    {
        public string Name { get; set; }
        public LogLevel LogLevel { get; set; }

        public CustomLogger(string name, LogLevel logLevel)
        {
            Name = name;
            LogLevel = logLevel;
        }

        public IDisposable BeginScope(object state)
        {
            return null;
        }

        public bool IsEnabled(LogLevel logLevel)
        {
            return ((int)logLevel >= (int)this.LogLevel);
        }

        public void Write(LogLevel logLevel, int eventId, object state, Exception exception, Func<object, Exception, string> formatter)
        {
            Console.ForegroundColor = ConsoleColor.Green;
            var message = formatter(state, exception);
            Console.WriteLine(message);
            Console.ForegroundColor = ConsoleColor.Gray;
        }
    }
}

Für jeden Logger ist auch ein Logger-Provider bereitzustellen. Dieser hat die Aufgabe, einen Logger zu erzeugen:

using Microsoft.Framework.Logging;
using System;

namespace FlugDemo.Logging
{
    public class CustomLoggerProvider : ILoggerProvider
    {
        private LogLevel LogLevel;

        public CustomLoggerProvider(LogLevel logLevel)
        {
            this.LogLevel = logLevel;
        }

        public ILogger Create(string name)
        {
            return new CustomLogger(name, LogLevel);
        }
    }
}

Damit ASP.NET 5 den Logger bzw. LoggerProvider verwendet, ist letzterer zu registrieren. Dies erfolgt in der Methode ConfigureServices der Klasse Startup.

public void ConfigureServices(IServiceCollection services, ILoggerFactory  loggerFactory)
{
    loggerFactory.AddProvider(new CustomLoggerProvider(LogLevel.Verbose));
    […]
}

Um mit dem Logger im Zuge der Programmausführung Nachrichten zu protokollieren, lässt man sich eine ILoggerFactory injizieren. Dessen Methode Create erzeugt einen Logger. Dieser Logger bekommt über einen Typ- bzw. Übergabeparameter einen Namen zugewiesen. Es hat es sich eingebürgert, dass die loggende Klasse namensgebend ist. Dies hilft, den Ursprung von protokollierten Daten zu finden.

 [Route("api/[controller]")]
 public class FlugController : Controller
 {
     private ILogger logger;

     public FlugController(ILoggerFactory loggerFactory)
     {
         logger = loggerFactory.Create<FlugController>();
     }

     [HttpGet]
     public List<Flug> GetAll()
     {
         logger.WriteInformation("FlugController.GetAll");

         var reader = new FlugReader();
         return reader.FindAllFluege();
     }
 }