Σχετικά με τη σύνδεση στο ASP.NET Εφαρμογές (Προσπαθήστε να μοιράζεστε ΜSK2 πιθανότατα θα μοιραστείτε το )
Εισαγωγή
Η σύνδεση είναι ΕΠΙΧΕΙΡΗΣΗ ένα κρίσιμο μέρος των εφαρμογών, αλλά συχνά το βλέπω παρεξηγημένο /χρησιμοποιείται λανθασμένα στις εφαρμογές ASPΜSK1NET.Αυτό είναι μέρος της ανάρτησης και μέρος του μανιφέστο σχετικά με τον τρόπο αποτελεσματικής σύνδεσης στο ASP<.NET ApplicationsM SK4
Αυτό δεν είναι ένας πλήρης οδηγός για να συνδεθείτε;αυτήνΗ ' αναφέρει το LOTS των εκείνων που έρχονταιη ;Αυτή η ' αναφέρει περισσότερα σχετικά με την επιλογή μιας αποτελεσματικής στρατηγικής σύνδεσης για τις εφαρμογές ASPΗ ΜSK4Η Εφαρμογές .
Στην κύρια σύνδεση θα πρέπει να είναι το USEFUL; αν το ' συνδέεται ενώ εσείςΜSK2 αναπτύσσει ή συνδέονται στην παραγωγή αυτό θα έπρεπε να είναι χρήσιμο για εσάς ΜSK3 η ομάδα σας / οι χρήστες σας
Το πρόβλημα
Πολύ συχνά η σύνδεση γίνεται αντιληπτή, καθώς το ' ειδικά το κάνει όταν υπάρχουν εξαιρέσεις για το ' ειδικά πράγματα για το ΜSK3 ειδικά πιστεύω ότι αυτό παρεξηγεί τι θα πρέπει να είναι η συνδεσιμότητα για το . ειδικά
Η πρόσβαση δεν είναι μόνο για εξαιρέσεις
Σε γενικές γραμμές, θα πρέπει να είστε σε θέση να εκτελέσετε ένα σημαντικό μέρος της αίτησής σας τοπικάΜSK1 στο πλαίσιο αυτό log.LogInformation Είσαι φίλος σου.
Η λύση
Logging επιτυχία
Κατά τη διάρκεια των 30 αναφερθέντων χρόνων έγραψα το ' αναφέρθηκε γραπτό κώδικα είδα την ' αναφέρθηκαν μερικά παραδείγματα καλής καταχώρισης και WAY περισσότερες παραδείξεις κακής καταχωρίσεως ειδικά η . αναφέρθη
Αρχές της καλής καταχώρισης:
- Η εγγραφή στην Ανάπτυξη θα πρέπει να παρέχει επαρκείς πληροφορίες σχετικά με το πώς εκτελείται η εφαρμογή σας για να κατανοήσετε τι συμβαίνει όταν πραγματοποιείται η έκθεση .
- Η εγγραφή στην παραγωγή θα πρέπει να σας δώσει έναν εξαιρετικά γρήγορο και εύκολο μηχανισμό για να καταλάβετε πώς η εφαρμογή σας αποτυγχάνει.
- TOO MUCH εγγραφή στην παραγωγή είναι ένα αρνητικό; αν και μπορεί να επιβραδύνει την εφαρμογή σας και να κάνει πιο δύσκολο να βρείτε τα σημαντικά πράγματα.
Θυμηθείτε ότι το ; logging ALWAYS μειώνει την απόδοση της εφαρμογής σας; θα πρέπει να καταχωρίσετε τι χρειάζεστε για τη διάγνωση ενός προβλήματος αλλά όχι περισσότερο στην παραγωγή ΜSK2 όπου η απόδοση είναι κρίσιμη M SK3.Msky5DonMK6 τρέχει μια δοκιμή απόδοσης όταν χρησιμοποιεί πλήρη Debug Logging
Τύποι σύνδεσης στο ASP.NET
Serilog vs Microsoft.Extensions.Logging
Στο ASP.NET έχετε ήδη μια εγκατάσταση στο Logging System; Microsoft.Extensions.Logging. Αυτό είναι ένα καλό σύστημα καταγραφήςΜSK1, αλλά αυτόΗ ΜSK2 δεν είναι τόσο ευέλικτη όσο η SerilogΗ . Η Seriloga είναι ένα πιο εύκαμπτο σύστημα καταχωρίσεων που σας επιτρέπει να συνδεθείτε σε πολλαπλές συγκομιδές Ο ΜSK4εξέρχεταιΟ ) και εμπλουτίζει τα λογότυπα σας με πρόσθετες πληροφορίεςΤο ΜSK6
Σύνδεση BootStrap
Αυτό είναι το logging που συμβαίνει όταν η εφαρμογή σας ξεκινάει.ΑυτόΜSK1 ικανοποιεί το πρώτο πράγμα που συμβαίνουν, και αυτό ΜSK3 ικανοςποιεί τα πρώτα πράγματα που θα πρέπει να δείτε κατά την εκτέλεση της εφαρμογής σαςM SK4Στη ASPMSKA5NET ειδικά όταν χρησιμοποιείτε τη διαμόρφωση αυτόMSKE6 κρίσιμη καταλαβαίνετε τιMIKE7 συμβαίνει κατά την έναρξη της εφαρμογής σας
Για παράδειγμα στο Serilog μπορείτε να το κάνετε αυτό:
Log.Logger = new LoggerConfiguration()
.WriteTo.Console()
.WriteTo.File("logs/boot-*.txt", rollingInterval: RollingInterval.Day, retainedFileCountLimit: 7)
.CreateBootstrapLogger();
ΣΗΜΕΙΩΣΗ σχετικά με: Αυτό είναι περιορισμένο επειδή δεν έχετε πρόσβαση στη διαμόρφωση αυτή τη στιγμή για να χρησιμοποιήσετε, για παράδειγμα, το AppInsights που σας ενδιαφέρει' πιθανότατα χρειάζεστε ένα #if RELEASE μπλοκ για να ρυθμίσετε το κατάλληλο κλειδί .
Αυτό που κάνει είναι να σας δώσει δεδομένα σχετικά με τυχόν προβλήματα εκκίνησης στην εφαρμογή σας; γράφει τόσο για την κονσόλα όσο και σε ένα αρχείο. ΤοM SK2 έχει επίσης σημασία για να βεβαιωθείτε ότι δεν μπορείτε να αποθηκεύσετε όλα τα αρχεία καταγραφήςMSKA4 μπορείτε να δείτε εδώ τοMKA5 μόνο εξοικονόμηση MK6 ημέρες αξίας των λογαριασμώνMCA7
You'll also want to wrap your startup method ΜSK1 διατηρήστε αυτή την εφαρμογή χρησιμοποιώ το νέο Program.cs μέθοδος) σε μια προσπάθεια/catch και καταγράψτε τυχόν εξαιρέσεις που συμβαίνουν εκείM SK2
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();
}
Το Log.CloseAndFlush() είναι σημαντικό, καθώς εξασφαλίζει ότι όλα τα λογότυπα γράφονται στον δίσκο Η εφαρμογή διατήρησης του ( καταρρέει έτσι αλλιώς θα βγει πριν το κάνει αυτόΜSK3
Εδώ ανιχνεύω επίσης εάν η εφαρμογή εκτελείται σε λειτουργία μετανάστευσης και, κατά συνέπεια, συνδεθώ αυτό και βγαίνω.
Log.Fatal είναι το πιο σκληρό επίπεδο λογισμικού; αυτόΜSK1 χρησιμοποιείται όταν η εφαρμογή σας πρόκειται να καταρρεύσει.
Όχι όλες οι εξαιρέσεις είναι θανατηφόρες - ίσως πρέπει να χρησιμοποιήσετε Log.Error για εκείνους ( παρόλο που εννοούν την APP ΜSK1 δεν διατηρεί το αίτημα Η ) δεν μπορεί να συνεχίσει να περάσει αυτό το σημείο
Λογιστικά επίπεδα
Σε ASP.NET ( και ΜSK2NET Περισσότερα γενικάM SK3 έχετε μια σειρά από επίπεδα καταγραφήςMK4
Log.Fatal- Αυτό είναι το πιο σκληρό επίπεδο λογισμικούΜSK1 χρησιμοποιείται όταν η αίτησή σας πρόκειται να καταρρεύσει ΜSK3Log.Error- Αυτό χρησιμοποιείται όταν συμβαίνει μια εξαίρεση που σημαίνει ότι η APP ΜSK1 δεν διατηρεί την αίτηση ΜSK2 δεν μπορεί να συνεχίσει πέρα από αυτό το σημείο .Log.Warning- Αυτό χρησιμοποιείται όταν κάτι συμβαίνει ότι το ' δεν αναφέρει κάποιο σφάλμα, αλλά είναι κάτι που πρέπει να γνωρίζετε για το ΜSK2 για παράδειγμα μια υποβαθμισμένη υπηρεσία. Όχι αρκετά σωστά Κανένα λάθος δεν ανακοινώθηκεLog.Information- Αυτό χρησιμοποιείται για γενικές πληροφορίες σχετικά με το τι συμβαίνει στο ' στην εφαρμογή σαςLog.Debug- Αυτό χρησιμοποιείται για πληροφορίες που το ' αναφέρει χρήσιμες μόνο όταν γνωρίζετε ότι η ' αναφέρει την αποσύνδεση της εφαρμογής σας Το αναφέρει ότι το ' αναφέρει ΕΠΙΤΥΧΙΑ στην ανάπτυξη, αλλά θα πρέπει να απενεργοποιηθεί στην παραγωγή
Για την παραγωγή που μου άρεσε' συνήθως καθορίστηκε η καταχώριση να είναι Log.Fatal, Log.Error και Log.Warning ΜΟΝΟ ΠΡΟΣΩΠΙΚΕΣ ΕΞΕΤΑΣΕΙΣ
Λογισμικό Runtime
Σε αντίθεση με την αρχική εγγραφή, αυτό είναι το logging που συμβαίνει όταν η εφαρμογή σας εκτελείται. Αυτό είναι το login που σας λέει τι' συμβαίνει στην εφαρμογή σου ανά πάσα στιγμήM SK2
Για παράδειγμα, για να χρησιμοποιήσετε αυτά στο Serilog σας αρέσει'd κάνετε αυτό:
"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"
}
},
εμπλουτισμός
Όπως σας αρέσει' αναμένεται να δείτε ΑρέσειΜSK1 αναμένετε αρκετά μεγάλο οπαδός του Serilog αναμένω; αναμένειΑρέσει ΜSK3 διατηρεί μια μεγάλη βιβλιοθήκη καταγραφής ότι το ' διατηρείται πολύ ευέλικτο. Αναμένεται Ένα από τα πράγματα που μου αρέσουν γι 'αυτό είναι η ικανότητα να εμπλουτίσετε τα λογότυπα σας με πρόσθετες πληροφορίες για. αναμένοντας Αυτό μπορεί να είναι πολύ χρήσιμο στη διάγνωση προβλημάτων στην εφαρμογή σας Στο ανωτέρω παράδειγμα μπορείτε να δείτε I'm εμπλουτίζοντας τα λογότυπα μου με το thread id, thread nameM SK2 process ID και proces name . Αυτό μπορεί να είναι πολύ χρήσιμο στη διάγνωση προβλημάτων στην εφαρμογή σας
Εγκαθιστώ επίσης τη σύνδεση για να πάει σε πολλαπλά 'sinksM SK1 ΜSK2outputs); σε αυτή την περίπτωση θέλω το 'm στέλνει στην κονσόλαMSKA5 σε ένα αρχείο και στο SeqMKA6 logging serviceMSKE7
Έχοντας πολλαπλές συνδέσεις είναι χρήσιμη σε περίπτωση που ένα αποτύχει, σε αυτή την περίπτωση η προτιμώμενη υπηρεσία εγγραφής μου είναι SeqΜSK1 έτσι το στέλνω εκεί πρώτα. Στη συνέχεια, αν αυτό αποτυγχάνει θα το στείλω στην κονσόλα και σε ένα αρχείο ΜSK3
Εγκαθιστώ επίσης την ιδιότητα του ApplicationName στα λογότυπα; ίσως αυτό μπορεί να είναι χρήσιμο αν έχετε πολλές εφαρμογές που συνδέονται στην ίδια υπηρεσία ΜSK1για τις διανεμημένες εφαρμογές συχνά θα κάνετε το ; μαζί με ένα αναγνωριστικό σύνδεσης για να συσχετίσετε τα logs μαζί για μία μόνο αίτηση).
Για παράδειγμα, αν έχετε ένα JS μπροστινό άκρο και ένα .NET backend μπορείτε να ρυθμίσετε το ID συσχέτισης στο μπροστινο άκρο σας και να το μεταφέρετε στο backendM SK1 Αυτό σας επιτρέπει να δείτε όλα τα λογότυπα για μια ενιαία αίτηση σε ένα μέρος. OR εάν χρησιμοποιείτε HttpClient στο backender σας μπορείτε να περάσετε τον ID συσχετισμού στα headers στην άλλη υπηρεσίαMK3
Υπάρχει ίσως' έχει μεγάλη κάλυψη για το πώς θα μπορούσατε να κάνετε αυτό εδώ: https ://josef.codesM SK4appendMK5correlationMST6MSM7MS8MSS9MSC10MSP11MSZ12MSL13Msl14ML15ΜσΚ16Θα την καλύψω σε ένα μελλοντικό postMSH17
Διαρθρωμένη σύνδεση
Η δομημένη εγγραφή είναι ένας τρόπος εγγραφής που καθιστά ευκολότερο να αναζητήσετε και να φιλτράρετε τα λογότυπα σας. Στο Serilog μπορείτε να το κάνετε χρησιμοποιώντας την Log.Information("This is a log message with {Property1} and {Property2}", property1, property2); syntax. Αυτό διευκολύνει την αναζήτηση λογαριασμών με μια συγκεκριμένη ιδιοκτησίαΜSK1
Σύνδεσμος Logging
Χρησιμοποιώντας το Serilog μπορείτε επίσης να χρησιμοποιήσετε LogContext.PushProperty να προσθέσετε ιδιότητες στα αρχεία σας που είναι σχετικές μόνο για ένα συγκεκριμένο πεδίο. Αυτό μπορεί να είναι πολύ χρήσιμο στη διάγνωση προβλημάτων στην εφαρμογή σαςΜSK1
Εισαγωγή Serilog
Το Serilog είναι εξαιρετικά ευέλικτο στο ότι σας επιτρέπει να το ρυθμίσετε σε κώδικα, καθώς και μέσω της διαμόρφωσης. Για παράδειγμα, για να χρησιμοποιήσετε τη διαμόρφωση που αναφέρετε παραπάνω'd κάνετε αυτό:
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");
});
Αυτό είναι το ίδιο με τη διαμόρφωση παραπάνω, αλλά σε κώδικα.Αυτό είναι χρήσιμο αν θέλετε να ρυθμίσετε την εγγραφή σας στον κωδικό; αυτόΜSK2 πραγματικά πάνω από εσάς πώς το κάνετε
Εξαιρέσεις φίλτρα
Στο ASP.NET μπορείτε να χρησιμοποιήσετε φίλτρα εξαιρέσεων για να συλλέξετε και να τα καταχωρήσετε.Αυτό είναι ένας πολύ καλός τρόπος για να βεβαιωθείτε ότι έχετε καταχωρήσει όλες τις εξαιρήσεις στην εφαρμογή σαςM SK2 ΠΩΣ ΕΠΙΧΕΙΡΗΣΕΤΑΙ Το ' δεν υποδεικνύει μια αντικατάσταση για την καταχώρηση σε επίπεδο μεθόδου το ; ίσως θα πρέπει ακόμα να συνδεθείτε στο επίπεδο μεθοδίου έτσι ώστε να μπορείτε να δείτε τι συμβαίνει στο ' αναφέρει στην εφαρμογή σας λεπτομερώς το ; ίσως το φίλτρο εξαίρεσης απλά δείχνει τι συμβαίνουν μόλις ολόκληρη η γραμμή αιτήσεων έχει γίνει ακατέργαστη και μπορεί συχνά να είναι πολύ σύγχυση για να εργαστεί έξω από ό, τι ακριβώς το M SK4 αναφέρει συνέβη.
Αυτό άλλαξε στο ASP.NET Core 8 και υπάρχουνMK2ται ένα TON μπορείτε να κάνετε με αυτά Νέα χαρακτηριστικά.
Μπαγκ ξανά οι ίδιες αρχές εφαρμόζονται; θα πρέπει να συνδεθείτε στο επίπεδο μεθόδου, ώστε να μπορείτε να δείτε τι ακριβώς' συμβαίνει στην εφαρμογή σας λεπτομερώςM SK2 τα φίλτρα εξαίρεσης / διαχειριστές κατάστασης απλά δείχνουν τι συμβαίνει μόλις ολόκληρη η αποθήκη αιτήσεων έχει γίνει ακατέργαστη και μπορεί συχνά να είναι πολύ σύγχυση για να εργαστεί έξω από ό, τι ακριβώςΜSK4 συνέβη
ΔΟΝ' ΕΧΕΙ ΚΑΘΕ ΠΡΟΣΩΠΙΚΑ
Η εγγραφή θα πρέπει να είναι κατάλληλη για το περιβάλλον; στην Ανάπτυξη καταχωρείτε τα πάντα έτσι ώστε να μπορείτε να δείτε τι συμβαίνει σε κάθε σημείο της εφαρμογής σας αλλά στο Test χρειάζεστε λιγότερη εγγραφή Η ( μπορεί να συνδεθείτε Πληροφορίες εδώΗ ΜSK2 και στην Παραγωγή χρειάζονται ακόμη λιγότερα Ο ΜSK3Προσοχή και πάνωΗ μSK4
Το ' μπορεί να πειραματιστεί για να καταχωρίσει τα πάντα στην παραγωγή, αλλά το ' μπορεί να κάνει μια κακή ιδέα στο . ίσως θα πρέπει να καταγράψετε όλα όσα χρειάζεστε για να διαγνώσετε ένα πρόβλημα, αλλά όχι περισσότερο σε . Σε παρόχους cloud μπορείτε εύκολα να φορτώσετε για την ποσότητα των δεδομένων που στέλνετε στην υπηρεσία καταχώρισης έτσι ώστε να είστε προσεκτικοί σχετικά με το τι συνδεθείτε και πόσο καιρό αποθηκεύετε αυτά τα λογότυπα για (Η Application Insights αποθηκεύει τα λογοτύπα για 🎁90 ημέρες κατά προεπιλογή ΜSK6 αυτό είναι συχνά TOO LONG και θα σας κοστίζει όσο αυτά τα στοιχεία αποθηκευτούν.
Για μια πολύ 'ενεργόΜSK1 εφαρμογή που μόλις κέρδισε' χρειάζεται μακροπρόθεσμη εγγραφή αυτών των δεδομένωνM SK3 θα σας αρέσει' θα έχετε μια καλή ιδέα για το τιMK5 συμβαίνει στην εφαρμογή από τις τελευταίες ημέρες των καταγραφώνMST6
Ζητήστε σύνδεση
Μόλις το συνηθισμένο πρόβλημα που βλέπω στην παραγωγή είναι η καταχώριση αποτυχημένων αιτήσεων; ενώ αυτά μπορούν να είναι ενδιαφέροντα (Κανείς δεν θέλει ένα ΜSK2 ΜSK3 401) αυτά μπορεί να είναι μια τεράστια ποσότητα δεδομένων και θα μπορούσε να είναι πολύ δαπανηρή για την αποθήκευσηM SK5 Θα πρέπει μόνο να καταχωρίσετε πράγματα Θέλεις να διορθώσεις, για ΜSK1 μπορεί να είναι ότι αυτό είναι σημαντικό καθώς μπορεί να υποδεικνύει ένα σπασμένο σύνδεσμο στην εφαρμογή σας ΜSK2 για μια 401 θα μπορούσε να είναι πως αυτό είναι σημαντικό επειδή μπορεί να δείξει ένα σπάσιμο σύστημα εξακρίβωσης ΜСК4
ΠΩΣ, όπως αναφέρθηκα παραπάνω αυτά είναι καλύτερα επεξεργασμένα στον κώδικα που πραγματικά συμβαίνουν στο ( διατηρούν την περίπτωση του ΜSK1 ίσως να είναι ότι θα πρέπει επίσης να συνδεθεί ως ένα Warning ή Error στο κώδικα που πραγματικά παράγει το 401.
Για να ρυθμίσετε την εγγραφή αίτησης στο Serilog μπορείτε να το κάνετε αυτό:
app.UseSerilogRequestLogging();
Αυτό θα καταχωρίσει όλες τις αιτήσεις για την εφαρμογή σας; αυτόΜSK1 είναι ένας πολύ καλός τρόπος να δείτε τι ακριβώς' συμβαίνει στην εφαρμογή σου σε υψηλό επίπεδο; αλλά και πάλι πρέπει να είστε προσεκτικοί σχετικά με το τι συνδεθείτε και πόσο καιρό διατηρείτε αυτά τα λογότυπα για ΜSK4
Για Application Insights μπορεί να θέλετε ακόμα να συνδεθείτε χρησιμοποιώντας το επίπεδο Πληροφοριών, καθώς θα σας δώσει τη δυνατότητα ταξιδιού των χρηστών; ίσως αυτό είναι ένας πολύ καλός τρόπος για να δείτε πώς οι χρήστες χρησιμοποιούν την εφαρμογή σας και μπορεί να είναι πολύ χρήσιμο στη διάγνωση προβλημάτων; ίσως όμως ξανά αυτά τα γρήγορα κοστίζουν έτσι πρέπει να είστε προσεκτικοί σχετικά με το τι συνδέεστε και πόσο καιρό διατηρείτε αυτές τις εγγραφές γιαM SK2
Στο συμπέρασμα
Έτσι, για το ' ικανοποιεί αυτό για το ΜSK1 ικανούσε μια γρήγορη εκτέλεση του πώς να συνδεθείτε στις εφαρμογές ASP για το . ικανούς αποδοχής εφαρμογών . ικανοί Πολλά από αυτά είναι μια αντίδραση πάνω σε- ικανοιχτέςΜSK5 άχρηστα καταλόγια βλέπω σε πολλές εφαρμογές παραγωγής. Στην εξέλιξη που θέλετε να δείτε Πώς λειτουργεί η εφαρμογή; επιχειρήσεις στην παραγωγή που θέλετε να δείτε Πώς αποτυγχάνει η εφαρμογή. Η σύνδεση είναι πολύ συχνά άχρηστη, δαπανηρό μέρος της ανάπτυξης εφαρμογώνΜSK1 Όπως με τα πάντα στην ανάπτυξη λογισμικού συνδέσεις θα πρέπει να επικεντρωθεί στον χρήστη ΜSK2 αν το δικό του / άλλους προγραμματιστές ενώ εργάζονται για την εφαρμογή στο IDE σας / τοπικά ή διαχωρίζοντας προβλήματα στην παραγωγή γρήγορα και αποτελεσματικά