Seq για ASP.NET Συνδεσιμότητα ΜSK1 Συζήτηση με SerilogTracing
Εισαγωγή
Στο προηγούμενο μέρος σας έδειξα πώς να εγκαταστήσετε Αυτόματη φιλοξενία για Seq χρησιμοποιώντας ASP.NET Core . Τώρα που το έχουμε εγκαταστήσειΗ ' διαθέτει χρόνο για να χρησιμοποιήσει περισσότερα από αυτά Η ' διαθέτει χαρακτηριστικά για να επιτρέψει πλήρη συνδεσιμότητα Το & μπορεί να παρακολουθεί με τη χρήση της νέας μας περιόδου Seq Το . μπορεί
Τρέκινγκ
Η παρακολούθηση είναι σαν να συνδεθείτε με το ++ δεδομένου ότι σας δίνει ένα επιπλέον στρώμα πληροφοριών σχετικά με αυτό που συμβαίνει με το ' στην εφαρμογή σας, ειδικά με τα . δεδομένα Το ' είναι ιδιαίτερα χρήσιμο όταν έχετε ένα κατανεμημένο σύστημα και πρέπει να παρακολουθήσετε μια αίτηση μέσω πολλαπλών υπηρεσιών. Σε αυτή την ιστοσελίδα μου αρέσει'm χρησιμοποιώντας το για να παρακολουθήσετε τα προβλήματα γρήγορα; απλά επειδή αυτό είναι ένα χόμπι site δενΜSK2t σημαίνει ότι εγκαταλείψω τα επαγγελματικά μου πρότυπα.
Επεξεργασία Serilog
Η τοποθέτηση της παρακολούθησης με το Serilog είναι πραγματικά αρκετά απλή χρησιμοποιώντας την ΣΕΡΙΛΟΓΙΚΗ ΤΡΑΚΙΔΙΑ πακέτο. Πρώτα πρέπει να εγκαταστήσετε τα πακέτα:
Εδώ προσθέτουμε επίσης την κονσόλα sink και το Seq sink
dotnet add package SerilogTracing
dotnet add package SerilogTracing.Expressions
dotnet add package Serilog.Sinks.Console
dotnet add package Serilog.Sinks.Seq
Η κονσόλα είναι πάντα χρήσιμη για την αποσύνδεση και το Seq είναι αυτό που γνωρίζουμε' ανακοινώνει εδώ για. ανακοινώσεις Seq διαθέτει επίσης μια γκάμα ' αναζωογονητές ειδικά' εταιρείες οι οποίες μπορούν να προσθέσουν πρόσθετες πληροφορίες στα λογότυπα σας ειδικά
"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"
}
}
Για να χρησιμοποιήσετε αυτούς τους εμπλουτιστές πρέπει να τα προσθέσετε στο δικό σας Serilog Η διαμόρφωση στο δικό σας appsettings.json αρχείο.Πρέπει επίσης να εγκαταστήσετε όλους τους ξεχωριστούς εμπλουτιστές χρησιμοποιώντας το Nuget.
Εξάλλου' αναφέρει ένα από τα καλά και κακά πράγματα για το Serilog, αν βεβαιωθείτε εγκαθιστώντας ένα BUNCH των πακέτων; αλλά αυτό σημαίνει ότι προσθέτεις μόνο αυτό που χρειάζεσαι και όχι μόνο ένα μονολιθικό πακέτοM SK3 Εδώ ' ικανοποιεί μου

Με όλα αυτά τα βομβαρδισμένα παίρνω ένα αρκετά καλό log output στο Seq.

Εδώ μπορείτε να δείτε το μήνυμα σφάλματος, το αποτύπωμα ίχνος, το ID threadM SK2 το αναγνωριστικό διαδικασίας και το όνομα διαδικασίαςMK3Αυτή είναι όλες οι χρήσιμες πληροφορίες όταν γνωρίζετε' προσπαθείτε να παρακολουθήσετε ένα πρόβλημα
Ένα πράγμα που πρέπει να σημειώσω είναι ότι μου άρεσε το ' "MinimumLevel": "Warning", Στο δικό μου appsettings.json αρχείο. Αυτό σημαίνει ότι μόνο οι προειδοποιήσεις και πάνω θα συνδεθούν στο Seq. Αυτό είναι χρήσιμο για τη διατήρηση του θορύβου κάτω στα λογότυπα σαςΜSK2
Ωστόσο, στο Seq μπορείτε επίσης να καθορίσετε αυτό ανά Api Key; έτσι ώστε να Information (or αν σας αρέσει'ρ πραγματικά ενθουσιασμένος Debug) συνδεσιμότητα εγκατεστημένο εδώ και περιορίζει τι Seq πραγματικά καταγράφει από το κλειδί APIΜSK1

Σημειώστε: έχετε ακόμα την εφαρμογή πάνω απόΜSK1 μπορείτε επίσης να κάνετε αυτό πιο δυναμικό ώστε να μπορείτε να προσαρμόσετε το επίπεδο στην πτήση). Δείτε το Σιγκ Σίνκ Για περισσότερες λεπτομέρειες.
{
"Serilog":
{
"LevelSwitches": { "$controlSwitch": "Information" },
"MinimumLevel": { "ControlledBy": "$controlSwitch" },
"WriteTo":
[{
"Name": "Seq",
"Args":
{
"serverUrl": "http://localhost:5341",
"apiKey": "yeEZyL3SMcxEKUijBjN",
"controlLevelSwitch": "$controlSwitch"
}
}]
}
}
Τρέκινγκ
Τώρα προσθέτουμε Tracing, ξανά χρησιμοποιώντας SerilogTracing αυτό' είναι αρκετά απλόM SK2 Έχουμε την ίδια ρύθμιση όπως πριν αλλά προσθέτει μια νέα σίνκ για να παρακολουθείτεΜSK3
dotnet add package SerilogTracing
dontet add package SerilogTracing.Expressions
dotnet add SerilogTracing.Instrumentation.AspNetCore
Προσθέτουμε επίσης ένα επιπλέον πακέτο για να καταχωρίσουμε περισσότερες λεπτομέρειες στις βασικές πληροφορίες του aspnet.
Εισαγωγή σε Program.cs
Τώρα μπορούμε να αρχίσουμε πραγματικά να χρησιμοποιούμε την ιχνηλασία. Πρώτα πρέπει να προσθέσουμε τη ίχνος στο δικό μας Program.cs Πληροφορίες .
using var listener = new ActivityListenerConfiguration()
.Instrument.HttpClientRequests().Instrument
.AspNetCoreRequests()
.TraceToSharedLogger();
Το Tracking χρησιμοποιεί την έννοια του 'Δραστηριότητες' που αντιπροσωπεύει μια μονάδα εργασίαςM SK2Μπορείτε να ξεκινήσετε μια δραστηριότηταMK3 κάνετε κάποια δουλειά και στη συνέχεια σταματήστε τοMk4Αυτό είναι χρήσιμο για την παρακολούθηση μιας αίτησης μέσω πολλαπλών υπηρεσιών
Σε αυτή την περίπτωση, προσθέτουμε πρόσθετη παρακολούθηση για αιτήσεις HttpClient και αιτήματα AspNetCore. Προσφέρουμε επίσης μια TraceToSharedLogger που θα καταχωρίσει την δραστηριότητα στο ίδιο κατάλογο με το υπόλοιπο της εφαρμογής μας.
Χρησιμοποιώντας Tracking σε μια υπηρεσία
Τώρα έχουμε την εγκατάσταση παρακολούθησης μπορούμε να αρχίσουμε να το χρησιμοποιούμε στην εφαρμογή μας. Εδώ' παρέχει ένα παράδειγμα μιας υπηρεσίας που χρησιμοποιεί τον εντοπισμόM SK2
public async Task<PostListViewModel> GetPostsByCategory(string category, int page = 1, int pageSize = 10,
string language = MarkdownBaseService.EnglishLanguage)
{
using var activity = Log.Logger.StartActivity("GetPostsByCategory {Category}, {Page}, {PageSize}, {Language}",
new { category, page, pageSize, language });
try
{
var count = await NoTrackingQuery()
.Where(x => x.Categories.Any(c => c.Name == category) && x.LanguageEntity.Name == language)
.CountAsync();
var posts = await PostsQuery()
.Where(x => x.Categories.Any(c => c.Name == category) && x.LanguageEntity.Name == language)
.OrderByDescending(x => x.PublishedDate.DateTime)
.Skip((page - 1) * pageSize)
.Take(pageSize)
.ToListAsync();
var languages = await GetLanguagesForSlugs(posts.Select(x => x.Slug).ToList());
var postListViewModel = new PostListViewModel
{
Page = page,
PageSize = pageSize,
TotalItems = count,
Posts = posts.Select(x => x.ToListModel(
languages.FirstOrDefault(entry => entry.Key == x.Slug).Value.ToArray())).ToList()
};
activity.Complete();
return postListViewModel;
}
catch (Exception e)
{
activity.Complete(LogEventLevel.Error, e);
}
return new PostListViewModel();
}
Οι σημαντικές γραμμές εδώ είναι:
using var activity = Log.Logger.StartActivity("GetPostsByCategory {Category}, {Page}, {PageSize}, {Language}",
new { category, page, pageSize, language });
Αυτό ξεκινά μια νέα 'δραστηριότητεςΜSK1, η οποία είναι μονάδα εργασίας ΜSK2 Το' χρησιμεύει για την παρακολούθηση μιας αίτησης μέσω πολλαπλών υπηρεσιών Δεδομένου ότι το έχουμε ενσωματώσει σε μια δήλωση χρήσης αυτό θα ολοκληρωθεί και διατίθεται στο τέλος της μεθόδου μας, αλλά η ' έχει καλή πρακτική για να την ολοκληρώσει ρητά στην . ανέφερε
activity.Complete();
Στην εξαίρεση επεξεργασία μας, ολοκληρώνουμε επίσης τη δραστηριότητα αλλά με ένα επίπεδο σφάλματος και την εξαίτηση. Αυτό είναι χρήσιμο για την παρακολούθηση προβλημάτων στην εφαρμογή σαςΜSK1
Χρησιμοποιώντας ίχνη
Τώρα έχουμε όλη αυτή τη ρύθμιση μπορούμε να αρχίσουμε να την χρησιμοποιούμε. Εδώ'έχει ένα παράδειγμα απόδρασης στην εφαρμογή μουΜSK2

Αυτό σας δείχνει την μετάφραση μιας ενιαίας αναρτήσεως post. Μπορείτε να δείτε τα πολλαπλά βήματα για μια ενιαία post και όλες τις αιτήσεις και χρονολογίες του HttpClient.
Σημείωση Χρησιμοποιώ Postgres για τη βάση δεδομένων μου, ίσως σε αντίθεση με τον διακομιστή SQL ο οδηγός npgsql έχει εγχώρια υποστήριξη για την παρακολούθηση, ώστε να μπορείτε να πάρετε πολύ χρήσιμα δεδομένα από τις ερωτήσεις της βάσης δεδομένων σας όπως το SQL εκτελείταιΜSK1 χρονοδιαγράμματα κλπ ΜSK2 Αυτά είναι αποθηκευμένα ως 'spansM SK4 to Seq και δείτε τα ακόλουθα
"@t": "2024-08-31T15:23:31.0872838Z",
"@mt": "mostlylucid",
"@m": "mostlylucid",
"@i": "3c386a9a",
"@tr": "8f9be07e41f7121cbf2866c6cd886a90",
"@sp": "8d716c5f01ad07a0",
"@st": "2024-08-31T15:23:31.0706848Z",
"@ps": "622f1c86a8b33304",
"@sk": "Client",
"ActionId": "91f5105d-93fa-4e7f-9708-b1692e046a8a",
"ActionName": "Mostlylucid.Controllers.HomeController.Index (Mostlylucid)",
"ApplicationName": "mostlylucid",
"ConnectionId": "0HN69PVEQ9S7C",
"ProcessId": 30496,
"ProcessName": "Mostlylucid",
"RequestId": "0HN69PVEQ9S7C:00000015",
"RequestPath": "/",
"SourceContext": "Npgsql",
"ThreadId": 47,
"ThreadName": ".NET TP Worker",
"db.connection_id": 1565,
"db.connection_string": "Host=localhost;Database=mostlylucid;Port=5432;Username=postgres;Application Name=mostlylucid",
"db.name": "mostlylucid",
"db.statement": "SELECT t.\"Id\", t.\"ContentHash\", t.\"HtmlContent\", t.\"LanguageId\", t.\"Markdown\", t.\"PlainTextContent\", t.\"PublishedDate\", t.\"SearchVector\", t.\"Slug\", t.\"Title\", t.\"UpdatedDate\", t.\"WordCount\", t.\"Id0\", t0.\"BlogPostId\", t0.\"CategoryId\", t0.\"Id\", t0.\"Name\", t.\"Name\"\r\nFROM (\r\n SELECT b.\"Id\", b.\"ContentHash\", b.\"HtmlContent\", b.\"LanguageId\", b.\"Markdown\", b.\"PlainTextContent\", b.\"PublishedDate\", b.\"SearchVector\", b.\"Slug\", b.\"Title\", b.\"UpdatedDate\", b.\"WordCount\", l.\"Id\" AS \"Id0\", l.\"Name\", b.\"PublishedDate\" AT TIME ZONE 'UTC' AS c\r\n FROM mostlylucid.\"BlogPosts\" AS b\r\n INNER JOIN mostlylucid.\"Languages\" AS l ON b.\"LanguageId\" = l.\"Id\"\r\n WHERE l.\"Name\" = @__language_0\r\n ORDER BY b.\"PublishedDate\" AT TIME ZONE 'UTC' DESC\r\n LIMIT @__p_2 OFFSET @__p_1\r\n) AS t\r\nLEFT JOIN (\r\n SELECT b0.\"BlogPostId\", b0.\"CategoryId\", c.\"Id\", c.\"Name\"\r\n FROM mostlylucid.blogpostcategory AS b0\r\n INNER JOIN mostlylucid.\"Categories\" AS c ON b0.\"CategoryId\" = c.\"Id\"\r\n) AS t0 ON t.\"Id\" = t0.\"BlogPostId\"\r\nORDER BY t.c DESC, t.\"Id\", t.\"Id0\", t0.\"BlogPostId\", t0.\"CategoryId\"",
"db.system": "postgresql",
"db.user": "postgres",
"net.peer.ip": "::1",
"net.peer.name": "localhost",
"net.transport": "ip_tcp",
"otel.status_code": "OK"
Μπορείτε να δείτε αυτό περιλαμβάνει σχεδόν όλα όσα χρειάζεστε για να ξέρετε σχετικά με το ερώτημα, το SQL εκτελέστηκε, τη γραμμή σύνδεσης κλπΜSK2 Αυτό είναι όλες οι χρήσιμες πληροφορίες όταν αναζητάτε' προσπαθείτε να παρακολουθήσετε ένα πρόβλημαM SK4 Σε μια μικρότερη εφαρμογή όπως αυτή είναι μόνο ενδιαφέρονMK5 σε μια διανεμημένη εφαρμογή που αναζητεί' σταθερή χρυσή πληροφορία για την παρακολούθηση προβλημάτων
Στο συμπέρασμα
Αγαπώ το ' μετράει μόνο την επιφάνεια της παρακολούθησης εδώ, μετράω ότι το ΜSK2 έχει μια μικρή περιοχή με παθιασμένους υποστηρικτέςΜSK3 μετράμε Ελπίζω να μου αρέσει το ΜΣΚ4 μετράτε δείχνει πόσο απλό είναι να πάμε με απλή παρακοπή χρησιμοποιώντας Seq ΜΣΚ5 μετρά Serilog για ASPΜσΚ6 μετράνεNET Κορυφορικές εφαρμογέςΜσκ7 Με αυτόν τον τρόπο μπορώ να κερδίσω πολλά από τα οφέλη των ισχυρότερων εργαλείων όπως το Application Insights χωρίς το κόστος του Azure ( μετράγουμε αυτά τα πράγματα μπορούν να δαπανηθούν όταν τα λογότυπα είναι μεγάλα