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();
}
}