Beim Loggen in ASP-.-NET-Anwendungen (Deutsch (German))

Beim Loggen in ASP-.-NET-Anwendungen

Sunday, 27 October 2024

//

11 minute read

Einleitung

Logging ist OF COURSE ein kritischer Teil der Anwendungen, aber ich sehe oft es missverstanden in ASP-..NET Anwendungen missbraucht Dies ist Teil Post und Teil Manifest auf, wie man effektiv in A SP-..NET-Anwendungen anmelden

Dies ist nicht ein vollständiger Führer zum Protokollieren ,; , there .' , die LOTS von denen da draußen , ; , it ?' ist mehr über die Wahl einer effektiven Protokollierungsstrategie für Ihre ASP , . .

In der Hauptprotokollierung sollte NUTZENFUL-; , ob es das Protokollieren von ' , während Sie entwickeln oder in der Produktion loggen , es sollte nützlich sein , um Sie Ihr Team , / , Ihre Benutzer , . .

Das Problem

Zu oft wird Logging gesehen, als das nur tun es, wenn dort.'. Ausnahmen...

LOGGING ist nicht nur für Exzeptionen

Im Allgemeinen sollten Sie in der Lage sein, einen wesentlichen Teil Ihrer Anwendung lokal auszuführen. log.LogInformation ist dein Freund

Die Lösung

Protokollierungserfolg

Im Laufe der Jahre I''ve geschriebenen Code IMSC2've gesehen ein paar Beispiele für gute Protokollierung Und WAY mehr Beispiele für schlechte Protokollierung

Grundsätze des guten Holzeinschlags

  1. Logging in der Entwicklung sollte ausreichende Informationen darüber geben, wie Ihre Anwendung läuft, um zu verstehen, was passiert, wenn die .
  2. Logging in der Produktion sollte Ihnen einen super schnellen und einfachen Mechanismus geben, um zu verstehen, wie Ihre Anwendung fehlschlägt.
  3. Zu viel Protokollierung in der Produktion ist ein negatives... es kann Ihre Anwendung verlangsamen und es schwieriger machen, das wichtige Zeug zu finden.

Denken Sie daran, ; logging ALWAYS zieht nach unten Ihre Anwendungsperformance.; log, was Sie brauchen, um ein Problem zu diagnostizieren, aber nicht mehr in der Produktion.MSC2 , wo die Leistung kritisch ist.. .

Arten der Protokollierung in ASP-.-NET

Serilog gegen Microsoft-.-Erweiterungen.-Protokollierung

In ASP-.-NET haben Sie bereits einen Build in der Protokollierung System-MSC1 Microsoft.Extensions.LoggingDies ist ein gutes Logging-System, aber es ist nicht so flexibel wie Serilog...Serilog ist ein flexibleres Protokollierungssystem, mit dem Sie sich auf mehrere Senken einloggen und Ihre Logs mit zusätzlichen Informationen bereichern können.MSC6.

BootStrap-Protokollierung

Dies ist die Protokollierung, die passiert, wenn Ihre Anwendung startet .. . Es ist das erste, was geschieht . , . und es ist das Erste, was Sie sehen sollten, wenn Sie Ihre Anwendung ausführen . . . In ASP .. .NET vor allem wenn Sie die Konfiguration es verwenden .

Zum Beispiel in Serilog können Sie dies tun

Log.Logger = new LoggerConfiguration()
             .WriteTo.Console()
             .WriteTo.File("logs/boot-*.txt", rollingInterval: RollingInterval.Day, retainedFileCountLimit: 7)
             .CreateBootstrapLogger();

HINWEIS:-Dies ist begrenzt, da du an dieser Stelle Zugriff auf die Konfiguration hast, also zum Beispiel AppInsights verwenden, die du wahrscheinlich benötigen #if RELEASE Block, um den entsprechenden Schlüssel einzustellen

Was dies tut, ist Ihnen Daten über alle Start-Probleme in Ihrer Anwendung zu geben, es schreibt sowohl zur Konsole und zu einer Datei, die auch wichtig ist, um sicherzustellen, dass Sie nicht speichern 't ALLE Log-Dateien , können Sie hier sehen wir ,'re nur Speichern von logs , .

Sie möchten auch Ihre Start-Methode einwickeln . . ( . in dieser App Ich verwende die neue Program.cs Methode, die in einem try-/ einfangen und irgendwelche Ausnahmen protokollieren, die dort geschehen

try
 {
        ..all your startup code
 }
catch (Exception ex)
{
    if(args.Contains("migrate"))
    {
        Log.Information("Migration complete");
        return;
    }
    Log.Fatal(ex, "Application terminated unexpectedly");
}
finally
{
    Log.CloseAndFlush();
}

Die Log-Version ist wichtig, da es sicherstellt, dass alle Protokolle auf Diskette geschrieben werden.Die App stürzt ab, sonst wird sie beendet, bevor sie dies tut.

Hier erkenne ich auch, ob die App in einem Migrationsmodus läuft und wenn ja logge ich das und beende das

Log.Fatal ist die schwerste Log-Ebene, die verwendet wird, wenn Ihre Anwendung kurz vor dem Absturz ist. Nicht alle Ausnahmen sind tödlich Sie sollten verwenden Log.Error für diejenigen, die nicht das APP bedeuten, es sei denn, sie meinen nicht die Anfrage.

Protokollebenen

Sie haben eine Reihe von Log-Levels.

  1. Log.Fatal Dies ist die schwerste Log-Ebene, die verwendet wird, wenn Ihre Anwendung kurz vor dem Absturz ist.
  2. Log.Error Dies wird verwendet, wenn eine Ausnahme passiert, die bedeutet, dass die APP nicht die Anfrage ist.
  3. Log.Warning Dies wird verwendet, wenn etwas passiert, dass nicht ein Fehler ist, sondern etwas ist, das Sie sich bewusst sein sollten. nicht ganz richtig aber nicht ein Fehler.
  4. Log.Information Dies wird für allgemeine Informationen darüber verwendet, was in Ihrer Anwendung geschieht.
  5. Log.Debug Dies wird für Informationen verwendet, die .' . nur nützlich sind, wenn Sie Ihre Anwendung debuggen ?( . ' . . in der Entwicklung aber sollte in der Produktion abgeschaltet werden .

Für die Produktion I'-d in der Regel setzen Sie die Protokollierung zu sein Log.Fatal, Log.Error und Log.Warning Nur ,.'

Laufzeitprotokollierung

Im Gegensatz zum Startprotokollieren ist dies das Protokollieren, das passiert, wenn Ihre Anwendung läuft .. . Dies ist die Protokollierung, die Ihnen sagt, was geschieht in Ihrer Anwendung zu einem bestimmten Zeitpunkt .

Zum Beispiel, um diese in Serilog you-'.d zu verwenden, tun Sie dies

  "Serilog": {
    "Enrich": ["FromLogContext", "WithThreadId", "WithThreadName", "WithProcessId", "WithProcessName", "FromLogContext"],
    "MinimumLevel": "Warning",
    "WriteTo": [
        {
          "Name": "Seq",
          "Args":
          {
            "serverUrl": "http://seq:5341",
            "apiKey": ""
          }
        },
      {
        "Name": "Console"
      },
      {
        "Name": "File",
        "Args": {
          "path": "logs/applog-.txt",
          "rollingInterval": "Day"
        }
      }

    ],
    "Properties": {
      "ApplicationName": "mostlylucid"
    }
  },

Anreicherungen

Wie du siehst, ist I''m ein ziemlich großer Fan von Serilog-;'s eine große Logging-Bibliothek, die ''s sehr flexibel macht Eine der Dinge, die ich daran mag, ist die Fähigkeit, Ihre Protokolle mit zusätzlichen Informationen zu bereichern..' Dies kann bei der Diagnose von Problemen in Ihrer Anwendung sehr nützlich sein. Im obigen Beispiel können Sie sehen, dass I'-m meine Protokolle mit dem Thread id-,-Thread-Namen bereichert.,-Prozess ID und Prozessname.MSC3- Dies kann sehr nützlich bei der Diagnose von Problemen in Ihrer Anwendung sein.

Ich habe auch die Protokollierung gesetzt, um zu gehen mehrere '-Sinks-'-Sekundardaten(-Ausgänge in diesem Fall I'-M sendet es an die Konsole und Seq Logging Service

Mehrere Spülen zu haben ist praktisch, falls man fehlschlägt.,... in diesem Fall ist mein bevorzugter Logging-Dienst Seq .MS K1 , also schicke ich es zuerst dorthin.. , Wenn das nicht funktioniert, schicke ich ihn an die Konsole und an eine Datei.

Ich habe auch die ApplicationName-Eigenschaft in den Protokollen eingestellt .; . Dies kann nützlich sein, wenn Sie mehrere Anwendungen haben, die sich auf denselben Dienst einloggen .( .welche für verteilte Anwendungen Sie häufig zusammen mit einer Korrelations-ID verwenden werden, um die Protokolle für eine einzelne Anfrage zusammenzubinden .

Wenn Sie z.B. ein JS-Frontend und ein Backend haben, können Sie die Korrelations-ID im Frontend festlegen und an das Backend übergeben... Dies ermöglicht es Ihnen, alle Protokolle für eine einzelne Anfrage an einem Ort zu sehen.MSC2. ODER wenn Sie HttpClient in Ihrem Backend verwenden, können sie die Korrelation-ID in den Headern an den anderen Dienst übergeben.

Es ist eine große Berichterstattung darüber, wie du dies hier tun konntest, : https.:// josef, . codes.../ append, MSC5 correlation, MCSK6 id- order- all- log, MKS10 entries, - agsp-- net, MSV14 core, / aber IM' ll decken es in einer zukünftigen post ?.

Strukturierte Protokollierung

Strukturierte Protokollierung ist eine Art der Protokollierung, die es einfacher macht, Ihre Logs zu suchen und filtern. Log.Information("This is a log message with {Property1} and {Property2}", property1, property2); syntax..- Dies macht es einfacher, nach Protokollen mit einer bestimmten Eigenschaft zu suchen.

Kontextprotokollierung

Mit Serilog können Sie auch LogContext.PushProperty Eigenschaften zu Ihren Protokollen hinzuzufügen, die nur für einen bestimmten Bereich relevant sind..- Dies kann sehr nützlich sein bei der Diagnose von Problemen in Ihrer Anwendung.

Serilog Setup

Serilog ist super flexibel in, dass es Ihnen erlaubt, es im Code sowie über config..... Zum Beispiel, um die Konfiguration oben zu verwenden

builder.Host.UseSerilog((context, services, configuration) =>
{
    configuration
        .MinimumLevel.Warning()
        .Enrich.FromLogContext()
        .Enrich.WithThreadId()
        .Enrich.WithThreadName()
        .Enrich.WithProcessId()
        .Enrich.WithProcessName()
        .WriteTo.Seq("http://seq:5341", apiKey: "")
        .WriteTo.Console()
        .WriteTo.File("logs/applog-.txt", rollingInterval: RollingInterval.Day)
        .Enrich.WithProperty("ApplicationName", "mostlylucid");
});

Dies ist das gleiche wie die Konfiguration oben, aber im Code...Dies ist nützlich, wenn Sie Ihre Anmeldung in code einrichten möchten...;.Es ist wirklich bis zu Ihnen, wie Sie es tun.

Ausnahmefilter

In ASP-.-NET können Sie Exception Filter verwenden, um Ausnahmen zu fangen und sie zu protokollieren..- Dies ist eine großartige Möglichkeit, sicherzustellen, dass Sie alle Ausnahmen in Ihrer Anwendung anmelden. WIE auch immer es ,' , nicht ein Ersatz für die Methode Ebene Logging .; , sollten Sie noch auf der Methode Ebene log, so dass Sie sehen können, was geschieht in Ihrer Anwendung im Detail , ; , die Ausnahme Filter zeigt nur, was passiert, wenn der gesamte Anfrage Stack wurde ungewickelt und kann oft sehr verwirrend zu arbeiten, was ,' , geschah , . ,

Dies änderte sich in ASP-.-NET-Core und es ist ein TON, den Sie mit diesen tun können neue Funktionen.

Fehler noch einmal die gleichen Prinzipien gelten .. . ; . Sie sollten sich auf der Ebene der Methode anmelden, so dass Sie sehen können, was in Ihrer Anwendung im Detail geschieht . ; . die Exception Filter nur zeigen, was passiert, wenn der gesamte Request Stack entwundet wurde und kann oft sehr verwirrend sein, um herauszufinden, was geschehen ist .

GESUNDHEITSBERECHNUNG

Logging sollte für die Umgebung geeignet sein...... in der Entwicklung protokollieren Sie alles, so dass Sie sehen können, was an jedem Punkt Ihrer Anwendung passiert, aber im Test benötigen Sie weniger Protokollierung.. ..(.Vielleicht log Informationen hier.. und in der Produktion brauchen Sie noch weniger Warnung und höher..

Sie sollten alles loggen, was Sie brauchen, um ein Problem zu diagnostizieren, aber nicht mehr.In Cloud-Anbietern können Sie leicht für die Menge an Daten aufgeladen bekommen, die Sie an den Logging-Dienst senden, so dass Sie vorsichtig sein sollten, was du loggst und wie lange du diese Protokolle für ( speicherst Application Insights speichert Logs für Standard-90 tage.;. Dies ist oft zu lang und kostet dich so lange, wie diese Logdaten gespeichert werden.

Für eine sehr aktive ', die Sie gerade gewonnen haben ', brauchen langfristiges Protokollieren von diesen Daten.;, du hast eine gute Idee davon, was in der App geschieht, aus den letzten Tagen von Logs.

Protokollierung anfordern

Einmal häufiges Problem, das ich in der Produktion sehe, ist die Protokollierung fehlgeschlagener Anfragen, während diese interessant sein können.(.nobody will ein 404..../.... diese können eine riesige Menge an Daten sein und sehr teuer zu speichern sein. Sie beabsichtigen zu reparierenEs kann sein, dass dies wichtig ist, da es einen kaputten Link in Ihrer Anwendung anzeigen kann.

WIE auch immer, wie ich oben erwähnt werden diese besser im Code behandelt sie tatsächlich in passieren, wenn im Fall von -401);. Es kann sein, dass diese sollten auch als ein protokolliert werden Warning oder Error in dem Code, der tatsächlich das erzeugt

Um Request Logging in Serilog einzurichten, können Sie dies tun.

app.UseSerilogRequestLogging();

Dies wird alle Anfragen an Ihre Anwendung protokollieren.' ist eine großartige Möglichkeit zu sehen, was in Ihrer Anwendung auf einem hohen Niveau geschieht.;. Aber wieder sollten Sie vorsichtig sein, was Sie loggen und wie lange Sie diese Protokolle behalten.

Für Application Insights können Sie immer noch mit Hilfe von Information Level protokollieren, da es Ihnen die nette User Journey-Funktion geben wird.Das ist eine großartige Möglichkeit zu sehen, wie Benutzer Ihre Anwendung verwenden und sehr nützlich bei der Diagnose von Problemen sein können.;. Jedoch wieder diese schnell Rack-up Kosten so sollten Sie vorsichtig sein, was Sie loggen und wie lange Sie diese Protokolle für halten.

Schlussfolgerung

So dass es ein schneller Lauf durch, wie man sich in ASP.....NET-Anwendungen anmeldet... ein großer Teil davon ist eine Reaktion auf over--.zealous... In der Entwicklung wollen Sie sehen wie die App läuftIn der Produktion, die Sie sehen möchten wie die App fehlschlägt. Logging ist zu oft ein nutzloses, teures Teil der Anwendungsentwicklung.. Wie bei allem in der Software-Entwicklung sollte Protokollierung auf die USER-Stickerei konzentriert werden, ob es sich um andere Entwickler während der Arbeit an der App in Ihrer IDE vor Ort oder das Aussortieren von Problemen in der Produktion schnell und effizient.

Finding related posts...
logo

© 2026 Scott Galloway — Unlicense — All content and source code on this site is free to use, copy, modify, and sell.