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