This is a viewer only at the moment see the article on how this works.
To update the preview hit Ctrl-Alt-R (or ⌘-Alt-R on Mac) or Enter to refresh. The Save icon lets you save the markdown file to disk
This is a preview from the server running through my markdig pipeline
Seq voor ASP.NET Logging - Tracing met SerilogTracing
Saturday, 31 August 2024
Inleiding
In het vorige deel toonde ik jullie hoe je het moet opzetten. Self-hosting voor Seq met ASP.NET Core . Nu we hem hebben opgezet, is het tijd om meer van hem te gebruiken.
Opvolging
Opsporen is net als aanteken++ het geeft je een extra laag informatie over wat er gebeurt in je toepassing' Het is vooral bruikbaar wanneer je een verspreid systeem hebt en je een verzoek via meerdere diensten moet opsporen. In deze site gebruik ik het om problemen snel op te sporen.
Serilog opzetten
Het opstellen van het rasteren met Serilog is heel eenvoudig door de Serilog Opvolging package. Eerst moet je de packages installeren.
Hier voegen we ook de Console- en Seq-sink toe.
dotnet add package SerilogTracing
dotnet add package SerilogTracing.Expressions
dotnet add package Serilog.Sinks.Console
dotnet add package Serilog.Sinks.Seq
Konsole is altijd nuttig voor ontfouting en Seq is wat we hier voor hebben.
"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"
}
}
Om deze verrijkers te gebruiken, moet je ze toevoegen. Serilog Opstelling in je adresboek. appsettings.json file. Je moet ook alle aparte verrijkers installeren met Nuget
Het is één van de goede en slechte dingen aan Serilog. Hier mijn van MSK.

Met al deze gebombardeerden krijg ik een behoorlijk goede loguitvoer in Seq.

Hier zie je de fout-message, de stapelstroom , de thread id, de proces id en de procesnaamM SK3 Dit is allemaal nuttige informatie als je een probleem probeert te achterhalen.
Eén ding om te merken is dat I' de "MinimumLevel": "Warning", In mijn leven appsettings.json file. Dit betekent dat alleen waarschuwingen en dergelijke in Seq gelogd worden.
Maar in Seq kan je dit ook per Api-Sleutel ; bepalen zodat je Information ( of als je ' heel enthousiast bent Debug) logset hier en beperk wat Seq daadwerkelijk opneemt met API-sleutel.

Let op: je hebt nog steeds app overhead , je kunt dit ook dynamischer maken zodat je het niveau kan aanpassen op de vlucht). Kijk naar de Seq-sink voor meer details.
{
"Serilog":
{
"LevelSwitches": { "$controlSwitch": "Information" },
"MinimumLevel": { "ControlledBy": "$controlSwitch" },
"WriteTo":
[{
"Name": "Seq",
"Args":
{
"serverUrl": "http://localhost:5341",
"apiKey": "yeEZyL3SMcxEKUijBjN",
"controlLevelSwitch": "$controlSwitch"
}
}]
}
}
Opvolging
Nu voegen we Tracking toe, opnieuw met SerilogTracing het'is vrij simpelM SK2 We hebben dezelfde opstelling als voorheen, maar we voegen een nieuwe spoel toe om te trazen .
dotnet add package SerilogTracing
dontet add package SerilogTracing.Expressions
dotnet add SerilogTracing.Instrumentation.AspNetCore
We voegen ook een extra pakket toe om meer gedetailleerde aspnet kerninformatie te logeren.
Opstelling in Program.cs
Nu kunnen we echt beginnen met het rasteren. Eerst moeten we de rastering aan onze Program.cs file.
using var listener = new ActivityListenerConfiguration()
.Instrument.HttpClientRequests().Instrument
.AspNetCoreRequests()
.TraceToSharedLogger();
Tracking gebruikt het concept van 'Activities' die een werkeenheid vertegenwoordigen . Je kunt een activiteit startenMSC3 een werk doen en dan stoppenM SK4 Dit is bruikbaar voor het volgen van een verzoek via meerdere diensten.
In dit geval voegen we extra opsporing toe voor HttpClient-vragen en AspNetCore-vragen. We voegen ook een TraceToSharedLogger Die registreert de activiteit op dezelfde logger als de rest van onze toepassing.
Het gebruik van achtervolging in een dienst
Nu hebben we een rastering-opstelling die we in onze toepassing kunnen gebruiken.
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();
}
De belangrijkste lijnen hier zijn:
using var activity = Log.Logger.StartActivity("GetPostsByCategory {Category}, {Page}, {PageSize}, {Language}",
new { category, page, pageSize, language });
Dit begint met een nieuwe 'activiteit', die een werkeenheid is . Het is bruikbaar voor het volgen van een verzoek via meerdere diensten. Omdat we het in een gebruiksverklaring verpakt hebben, zal dit op het einde van onze methode voltooien en aflossen maar het is goed gebruikelijk om het expliciet te completeren.
activity.Complete();
In onze uitsonderingshandlingsvanger completeren we ook de activiteit, maar met een foutniveau en de uitsondering. Dit is bruikbaar voor het opsporen van problemen in je applicatie.
Met Traces
Nu hebben we al deze opstelling die we kunnen beginnen te gebruiken.

Dit toont je de vertaling van een enkele markdown-post. Je ziet de meerdere stappen voor een enkele post en alle HttpClient-vragen en timings.
Let op dat ik Postgres gebruik voor mijn database, in tegenstelling tot SQL-server heeft de npgsql-driver native ondersteuning voor rastering zodat je zeer nuttige data van je databasevragen kunt krijgen zoals de SQL uitgevoerd, timings enz.
"@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"
Je kunt zien dat dit vrijwel alles bevat wat je moet weten over de zoekopdracht, de SQL uitgevoerd, de verbindingssträng enzovoort . Dit is allemaal nuttige informatie als je een probleem probeert op te sporen.
In slotting:
I' ik heb hier alleen de oppervlakte van het rasteren geskrabberd, , het is een bit-area met gepassioneerde advocaten, . Ik hoop dat ik ' heb aangetoond hoe eenvoudig het is om te gaan met simpele rastering met Seq. | & | Serilog voor ASP | МSK6 | Net Core applications |. | Op deze manier kan ik veel van de voordelen van krachtiger gereedschappen zoals Application Insights krijgen zonder de kosten van Azure. ♪ ( ♪ deze dingen kunnen te duur worden als de logs groot zijn. ♫ ). ♪