On logging in ASP.NET Applications (Part 1...πιθανότατα) (ελληνικά (Greek))

On logging in ASP.NET Applications (Part 1...πιθανότατα)

Sunday, 27 October 2024

//

10 minute read

Εισαγωγή

Η καταγραφή είναι του COURSE ένα κρίσιμο μέρος των εφαρμογών, ωστόσο συχνά βλέπω ότι παρεξήγησε / κακομεταχειρίστηκε σε εφαρμογές ASP.NET.

Αυτό είναι μέρος μετά και μέρος μανιφέστο για το πώς να συνδεθείτε αποτελεσματικά σε ASP.NET Εφαρμογές.

Αυτό δεν είναι ένας πλήρης οδηγός για την καταγραφή?Υπάρχει LOTS από εκείνους εκεί έξω?Είναι περισσότερο για την επιλογή μιας αποτελεσματικής στρατηγικής καταγραφής για τις εφαρμογές ASP.NET σας.

Στην κύρια καταγραφή θα πρέπει να είναι ΧΡΗΣΙΜΟΠΟΙΗΣΗ? Είτε είναι η καταγραφή κατά την ανάπτυξη ή την καταγραφή στην παραγωγή θα πρέπει να είναι χρήσιμο για εσάς / την ομάδα / τους χρήστες σας.

Το Πρόβλημα

Πολύ συχνά η καταγραφή θεωρείται ως το "μόνο να το κάνουμε όταν υπάρχουν εξαιρέσεις."

Νομίζω ότι αυτό παρεξηγεί τι πρέπει να είναι η καταγραφή.log.LogInformationΗ ΛΟΓΑΡΙΑΣΜΟΣ ΔΕΝ ΕΙΝΑΙ ΜΟΝΟ ΓΙΑ ΕΞΑΡΤΗΜΑΤΑ

Σε γενικές γραμμές, θα πρέπει να είστε σε θέση να εκτελέσετε ένα σημαντικό μέρος της αίτησής σας σε τοπικό επίπεδο.

Είναι φίλος σου.

Η Λύση

Καταγραφή Επιτυχίας

  1. Κατά τη διάρκεια των 30 ετών έχω γράψει κώδικα έχω δει μερικά παραδείγματα καλής καταγραφής και way περισσότερα παραδείγματα κακής καταγραφής.
  2. Αρχές καλής καταγραφής:
  3. Η καταγραφή στην ανάπτυξη θα πρέπει να παρέχει επαρκείς πληροφορίες σχετικά με το πώς τρέχει η εφαρμογή σας για να καταλάβετε τι συμβαίνει όταν.

Η logging in Production θα πρέπει να σας δώσει έναν εξαιρετικά γρήγορο και εύκολο μηχανισμό για να καταλάβετε πώς αποτυγχάνει η εφαρμογή σας.

Η πολύ μεγάλη καταγραφή στην παραγωγή είναι αρνητική.Μπορεί να επιβραδύνει την εφαρμογή σας και να καταστήσει δυσκολότερη την εύρεση των σημαντικών πραγμάτων.

Να θυμάστε; Η καταγραφή ΠΑΝΤΟΤΕ σέρνει κάτω την απόδοση της εφαρμογής σας; θα πρέπει να καταγράψετε αυτό που χρειάζεστε για να διαγνώσετε ένα πρόβλημα αλλά όχι περισσότερο στην παραγωγή / όπου η απόδοση είναι κρίσιμη (π.χ., μην εκτελέσετε μια δοκιμή απόδοσης κατά τη χρήση πλήρους καταγραφής αποσφαλμάτωσης).

Τύποι καταγραφής στο ASP.NETMicrosoft.Extensions.LoggingSerilog vs Microsoft.Extensions.Logging

Στο ASP.NET έχετε ήδη μια κατασκευή στο σύστημα καταγραφής?

Αυτό είναι ένα καλό σύστημα καταγραφής, αλλά δεν είναι τόσο ευέλικτο όσο Serilog.

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

Το Serilog είναι ένα πιο ευέλικτο σύστημα καταγραφής που σας επιτρέπει να συνδεθείτε σε πολλαπλούς νεροχύτες (εξόδους) και να εμπλουτίσετε τα αρχεία καταγραφής σας με πρόσθετες πληροφορίες.#if RELEASEΚαταγραφή BootStrap

Αυτή είναι η καταγραφή που συμβαίνει όταν αρχίζει η εφαρμογή σας.

Είναι το πρώτο πράγμα που συμβαίνει, και είναι το πρώτο πράγμα που πρέπει να δείτε όταν εκτελέσετε την αίτησή σας.Program.csΣτο ASP.NET ειδικά όταν χρησιμοποιείτε ρυθμίσεις είναι κρίσιμη, καταλαβαίνετε τι συμβαίνει όταν ξεκινά η εφαρμογή σας.

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

Είναι μια σούπερ κοινή πηγή θεμάτων σε εφαρμογές ASP.NET.

Για παράδειγμα στο Serilog μπορείτε να το κάνετε αυτό:

Log.FatalΣΗΜΕΙΩΣΗ: Αυτό είναι περιορισμένο καθώς δεν έχετε πρόσβαση στη διαμόρφωση σε αυτό το σημείο, έτσι για παράδειγμα για να χρησιμοποιήσετε AppInsights πιθανότατα θα χρειαστείτε ένα *μπλοκ για τον καθορισμό του κατάλληλου κλειδιού .*Αυτό που κάνει αυτό είναι να σας δώσει δεδομένα για οποιαδήποτε θέματα εκκίνησης στην εφαρμογή σας; γράφει τόσο για την κονσόλα όσο και για ένα αρχείο.Log.ErrorΕίναι επίσης σημαντικό να διασφαλιστεί ότι δεν αποθηκεύετε ΟΛΑ τα αρχεία καταγραφής? μπορείτε να δείτε εδώ είμαστε μόνο εξοικονομώντας 7 ημέρες των καταγραφής.

Θα θέλετε επίσης να τυλίξετε τη μέθοδο εκκίνησης σας (σε αυτή την εφαρμογή χρησιμοποιώ το νέο

μέθοδος) σε μια δοκιμή/αλιεία και καταγραφή τυχόν εξαιρέσεων που συμβαίνουν εκεί.

  1. Log.FatalΤο Log.CloseAndFlush() είναι σημαντικό καθώς εξασφαλίζει ότι όλα τα αρχεία καταγραφής είναι γραμμένα στο δίσκο (η εφαρμογή σας συντρίβεται έτσι αλλιώς θα βγει πριν το κάνει αυτό).
  2. Log.ErrorΕδώ επίσης διακρίνω αν η εφαρμογή εκτελείται με τρόπο μετανάστευσης και αν ναι το καταγράφω και βγαίνω.
  3. Log.Warningείναι το πιο σοβαρό επίπεδο καταγραφής· χρησιμοποιείται όταν η αίτησή σας πρόκειται να συντριβεί.Δεν είναι όλες οι εξαιρέσεις Θανατηφόρες- θα πρέπει να χρησιμοποιείτε το φάρμακο αυτό
  4. Log.Informationγια εκείνους (εκτός εάν εννοούν το APP (όχι το αίτημα) δεν μπορεί να συνεχιστεί μετά το σημείο αυτό).
  5. Log.DebugΕπίπεδα καταγραφής

Στο ASP.NET (και.NET Πιο γενικά) έχετε μια σειρά από επίπεδα καταγραφής:Log.Fatal, Log.Error- Αυτό είναι το πιο σοβαρό επίπεδο καταγραφής, χρησιμοποιείται όταν η αίτησή σας πρόκειται να συντριβεί.Log.Warning- Αυτό χρησιμοποιείται όταν συμβαίνει μια εξαίρεση που σημαίνει ότι το APP (όχι το αίτημα) δεν μπορεί να συνεχιστεί μετά από αυτό το σημείο.

- Αυτό χρησιμοποιείται όταν συμβαίνει κάτι που δεν είναι ένα λάθος, αλλά είναι κάτι που θα πρέπει να γνωρίζετε (για παράδειγμα μια μειωμένη υπηρεσία / κάτι

Δεν είναι ακριβώς σωστό.

αλλά όχι σφάλμα).

  "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"
    }
  },

- Αυτό χρησιμοποιείται για γενικές πληροφορίες σχετικά με το τι συμβαίνει στην αίτησή σας.

  • Αυτό χρησιμοποιείται για πληροφορίες που είναι χρήσιμες μόνο όταν αποσφαλματώνετε την αίτησή σας (είναι Παντού στην ανάπτυξη αλλά θα πρέπει να απενεργοποιηθεί στην παραγωγή). Για την παραγωγή θα ήθελα γενικά να ρυθμίσετε την καταγραφή για να είναι

και

Μόνο.

Καταγραφή χρόνου λειτουργίας

Σε αντίθεση με το startup loging αυτό είναι η καταγραφή που συμβαίνει όταν η εφαρμογή σας εκτελείται.

Αυτή είναι η καταγραφή που σας λέει τι συμβαίνει στην αίτησή σας ανά πάσα στιγμή.

Για παράδειγμα, για να χρησιμοποιήσετε αυτά στο Serilog θα κάνετε αυτό:

ΕμπλουτισμένοιLog.Information("This is a log message with {Property1} and {Property2}", property1, property2);Όπως θα δείτε είμαι αρκετά μεγάλος οπαδός του Serilog? Είναι μια μεγάλη βιβλιοθήκη καταγραφής που είναι πολύ ευέλικτη.

Ένα από τα πράγματα που μου αρέσει σε αυτό είναι η ικανότητα να εμπλουτίσει τα αρχεία καταγραφής σας με πρόσθετες πληροφορίες.

Αυτό μπορεί να είναι πολύ χρήσιμο στη διάγνωση θεμάτων στην εφαρμογή σας.LogContext.PushPropertyΣτο παραπάνω παράδειγμα μπορείτε να δείτε ότι εμπλουτίζω τα ημερολόγια μου με την ταυτότητα κλωστή, το όνομα κλωστής, την ταυτότητα διαδικασίας και το όνομα διαδικασίας.

Αυτό μπορεί να είναι πολύ χρήσιμο στη διάγνωση θεμάτων στην εφαρμογή σας.

Έβαλα επίσης την καταγραφή για να πάει σε πολλαπλές "βίδες" (εξόδους), σε αυτή την περίπτωση την στέλνω στην κονσόλα, σε ένα αρχείο και σε Seq (μια υπηρεσία καταγραφής). Το να έχω πολλούς νεροχύτες είναι βολικό σε περίπτωση που αποτύχει κάποιος, σε αυτή την περίπτωση προτιμώ την υπηρεσία καταγραφής είναι Seq, έτσι το στέλνω εκεί πρώτα.

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

Τότε αν αυτό αποτύχει, θα το στείλω στην κονσόλα και σε ένα αρχείο.

Επίσης, ορίζω την ιδιότητα ApplicationName στα αρχεία καταγραφής. Αυτό μπορεί να είναι χρήσιμο εάν έχετε πολλαπλές εφαρμογές να συνδεθείτε στην ίδια υπηρεσία (η οποία για τις κατανεμημένες εφαρμογές θα το κάνετε συχνά· μαζί με ένα αναγνωριστικό συσχέτισης για να συνδέσετε τα αρχεία καταγραφής μαζί για ένα μόνο αίτημα).

Για παράδειγμα, αν έχετε ένα JS front end και ένα .NET backend μπορείτε να ρυθμίσετε την ταυτότητα συσχέτισης στο μπροστινό άκρο και να το περάσετε στο backend. Αυτό σας επιτρέπει να δείτε όλα τα αρχεία καταγραφής για ένα μόνο αίτημα σε ένα μέρος.

Ή εάν χρησιμοποιείτε HttpClient στο backend σας μπορείτε να μεταβιβάσετε την ταυτότητα συσχέτισης στις κεφαλίδες στην άλλη υπηρεσία.Υπάρχει μεγάλη κάλυψη για το πώς θα μπορούσατε να το κάνετε αυτό εδώ: https://josef.codes/append-correlation-id-to-all-log-entries-in-asp-net-core/, αλλά θα το καλύψω σε μια μελλοντική ανάρτηση..

Δομημένη καταγραφή

Δομημένη καταγραφή είναι ένας τρόπος καταγραφής που καθιστά ευκολότερη την αναζήτηση και το φίλτρο καταγραφής σας.

Σε Serilog μπορείτε να το κάνετε αυτό με τη χρήση του

σύνταξη.

Αυτό καθιστά ευκολότερη την αναζήτηση για αρχεία καταγραφής με ένα συγκεκριμένο ακίνητο.

Καταγραφή πλαισίουName

Χρήση του Serilog μπορείτε επίσης να χρησιμοποιήσετε*για να προσθέσετε ιδιότητες στα αρχεία καταγραφής σας που είναι μόνο σχετικές για ένα συγκεκριμένο πεδίο εφαρμογής.*Αυτό μπορεί να είναι πολύ χρήσιμο στη διάγνωση θεμάτων στην εφαρμογή σας.

Ρύθμιση SerilogWarningSerilog είναι σούπερ ευέλικτη στο ότι σας επιτρέπει να το ρυθμίσετε σε κώδικα, καθώς και μέσω config.ErrorΓια παράδειγμα, για να χρησιμοποιήσετε την παραπάνω διαμόρφωση θα το κάνετε αυτό:

Αυτό είναι το ίδιο με την παραπάνω διαμόρφωση αλλά σε κώδικα.

app.UseSerilogRequestLogging();

Αυτό είναι χρήσιμο αν θέλετε να ρυθμίσετε την καταγραφή σας σε κώδικα? είναι πραγματικά στο χέρι σας πώς το κάνετε.

Φίλτρα εξαίρεσης

Στο ASP.NET μπορείτε να χρησιμοποιήσετε τα φίλτρα εξαίρεσης για να πιάσετε εξαιρέσεις και να τα καταγράψετε.

Αυτός είναι ένας πολύ καλός τρόπος για να διασφαλίσετε ότι καταγράφετε όλες τις εξαιρέσεις στην εφαρμογή σας. ΠΩΣ δεν είναι μια αντικατάσταση για τη μέθοδο καταγραφής επίπεδο; θα πρέπει ακόμα να συνδεθείτε στο επίπεδο της μεθόδου, ώστε να μπορείτε να δείτε τι συμβαίνει στην εφαρμογή σας λεπτομερώς; το φίλτρο εξαίρεσης απλά δείχνει τι συμβαίνει μόλις ολόκληρη η στοίβα αίτησης έχει αποσυνδεθεί και μπορεί συχνά να είναι πολύ σύγχυση για να επεξεργαστεί τι συνέβη.Αυτό άλλαξε στο ASP.NET πυρήνα 8 και υπάρχει ένας τόνος που μπορείτε να κάνετε με αυτάνέα χαρακτηριστικάBug και πάλι οι ίδιες αρχές ισχύουν; θα πρέπει να συνδεθείτε στο επίπεδο της μεθόδου, ώστε να μπορείτε να δείτε τι συμβαίνει στην εφαρμογή σας λεπτομερώς; τα φίλτρα / κατάσταση εξαίρεσης που χειρίζονται απλά δείχνουν τι συμβαίνει μόλις ολόκληρη η στοίβα αίτησης έχει αποσυνδεθεί και μπορεί συχνά να είναι πολύ σύγχυση για να επεξεργαστεί τι συνέβη.. ΜΗΝ ΛΟΓΑΡΙΑΖΕΤΕ ΤΑ ΠΡΑΓΜΑΤΙΚΑ

Finding related posts...
logo

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