Lutz Steinleger

Januar 24, 2024
w

Lassen Sie uns austauschen

Haben Sie eine Projektidee oder Fragen zum Einsatz von MORYX?

w

Lassen Sie uns austauschen

Wir freuen uns immer über einen offenen Austausch mit Ihnen.

Kontakt

Logging einer ASP.Net Core-Anwendung wie MORYX mit NLog

Digitale Fabrik

Jeder kennt das folgende Szenario: Ihre Anwendung funktioniert nicht wie erwartet. Sei es während der Entwicklung oder in ‘Production’, Logging hilft dabei, ein bestimmtes Verhalten zu analysieren. Dabei kann es sein, dass Sie an einer Stelle nur Meldungen mit höherer Priorität sehen wollen, während parallel ein sehr detailliertes Logfile geschrieben wird. NLog hilft, diese Anforderungen umzusetzen.

Blogbeitrag ASP:ET Core mit NLog

Was ist NLog?

NLog ist eine flexible und kostenlose Logging-Plattform für .NET-Plattformen und macht es einfach, in verschiedene Ziele zu schreiben (Datenbank, Datei, Konsole) und die Konfiguration der Protokollierung spontan zu ändern.

 

Unsere Ausgangssituation

Mit MORYX 6 haben wir auf .NET Core 6 umgestellt und beschlossen, alles, was nicht zur MORYX-Domäne gehört, an das .NET-Ökosystem zu delegieren. Eines davon ist ‘Logging’.

Vor der Umstellung haben wir eine eigene Implementierung eines Logging-Mechanismus verwendet. Glücklicherweise war diese dem Microsoft.Extension.Loggin.Ilogger bereits sehr ähnlich. Im alten Logging-Mechanismus hatten wir ebenfalls eine ILogger-Schnittstelle mit z.B. fast identischen Methoden.

Da unser Code nun von dem ‚richtigen‘ ILogger abhängt, können wir alle Logging-Pakete nutzen, die dieses Interface unterstützen, wie u.a. NLog es tut.

 

Wie man NLog verwendet

Um zu zeigen, wie NLog funktioniert, erstellen wir eine minimale MORYX-Anwendung als ASP.NET-Core-Anwendung. Das bedeutet, dass die Program.cs nicht viel anders aussieht als andere:

public static void Main(string[] args)
{
  AppDomainBuilder.LoadAssemblies();                // 1
  var host = Host.CreateDefaultBuilder(args)
      .ConfigureServices(serviceCollection =>
      {
        serviceCollection.AddMoryxKernel();        // 2 
        serviceCollection.AddMoryxModels();        // 2
        serviceCollection.AddMoryxModules();       // 2
       })
       .ConfigureWebHostDefaults(webBuilder =>
       {
          webBuilder.UseStartup<Startup>();
          webBuilder.UseIISIntegration();
        })
        .Build();
   host.Services.UseMoryxConfigurations("Config");  // 3
   host.Services.StartMoryxModules(); // 4
   host.Run();
   host.Services.StopMoryxModules(); // 5
}
  1. Assemblies werden geladen, um Abhängigkeiten in den folgenden Schritten einzurichten
  2. Die MORYX-Dienste werden der Service Collection hinzugrfügt
  3. Das MORYX-Konfigurationsverzeichnis wird festgelegt (Config)
  4. Die MORYX-Module werden gestartet…
  5. … und schließlich bei Programmende gestoppt.

 

NLog einrichten

In den folgenden Beispielen wird NLog Version 5.* verwendet:

PM> dotnet add package NLog -v 5.*; dotnet add package NLog.Web -v 5.*

Um es nutzen zu können, muss es in der Program.cs konfiguriert werden:

public static void Main(string[] args)
{
   LogManager
     .Setup()
     .LoadConfigurationFromFile("Config/nlog.config");  // 1
   AppDomainBuilder.LoadAssemblies();
   var host = Host.CreateDefaultBuilder(args)
       .ConfigureServices(serviceCollection =>
       {
         serviceCollection.AddMoryxKernel();
         serviceCollection.AddMoryxModels();
         serviceCollection.AddMoryxModules();
       })
       .ConfigureWebHostDefaults(webBuilder =>
       {
         webBuilder.ConfigureLogging(builder =>
         {
           builder.ClearProviders();                   // 2 
         });
         webBuilder.UseStartup<Startup>();
         webBuilder.UseIISIntegration();
       })
       .UseNLog()                                      // 3 
       .Build();
   host.Services.UseMoryxConfigurations("Config");
   host.Services.StartMoryxModules();
   host.Run();
   host.Services.StopMoryxModules();
}
  1. Lädt die NLog-Konfiguration. In diesem Fall wird sie aus dem angegebenen Pfad geladen. Hier ist es Config/nlog.config. Stattdessen könnte NLog auf innerhalb der appsettings.json konfiguriert und dann z.B. mit LoadConfigurationFromAppSettings() geladen werden. Es gibt mehrere Möglichkeiten, dies zu konfigurieren.
  2. Alle Logging-Provider werden entfernt. Standardmäßig ist bereits ein ConsoleLogger hinzugefügt. Da wir die Logs nicht nur an einem Ort haben wollen, entscheiden wir uns, diese zu entfernen und ausschließlich NLog-Logger zu verwenden.
  3. NLog nutzen.

 

NLog konfigurieren

Schließlich muss NLog konfiguriert werden. So sieht eine sehr einfache Konfiguration aus, die in die Konsole und ins Dateisystem protokolliert:

<!-- Config/nlog.config -->
<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xsi:schemaLocation="NLog NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >

    <targets>
      <!-- File Target -->
      <target name="logfile"
              xsi:type="File"
              fileName="Logs/${shortdate}.log"
              layout="${longdate} - ${level} [${logger}] - ${message} ${all-event-properties} ${exception:format=tostring}" />
      <!-- Console Target -->
      <target name="logconsole" xsi:type="Console" 
              layout="${longdate} - ${level} [${logger}] - ${message} ${all-event-properties} ${exception:format=tostring}" />
    </targets>

    <!-- Rules to map from logger name to target -->
    <rules>
      <logger name="*" minlevel="Information" writeTo="logfile" /> <!-- 1 -->
      <logger name="*" minlevel="Warning" writeTo="logconsole" /> <!-- 2 -->
    </rules>
</nlog>
  1. Logging in eine Datei, beginnend mit Einträgen im Log-Level „Information“.
  2. Da wir die Konsole hauptsächlich zur Anzeige von Fehlern verwenden wollen, wird die minlevel hier auf „Warning“ gesetzt.

Das war’s. Von hier aus ist es recht einfach, weiterzumachen und das gesamte Setup an die tatsächlichen Bedürfnisse eines Projekts anzupassen.

Brauchen Sie weitere Hilfe? Kontaktieren Sie uns gerne!

0 Kommentare

Einen Kommentar abschicken

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