Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Warning
Den här versionen av ASP.NET Core stöds inte längre. Mer information finns i supportpolicyn för .NET och .NET Core. För den nuvarande utgåvan, se .NET 9-versionen av den här artikeln .
Important
Den här informationen gäller en förhandsversionsprodukt som kan ändras avsevärt innan den släpps kommersiellt. Microsoft lämnar inga garantier, uttryckliga eller underförstådda, med avseende på den information som tillhandahålls här.
För den nuvarande utgåvan, se .NET 9-versionen av den här artikeln .
Den här artikeln innehåller vägledning för att samla in diagnostik från Kestrel för att felsöka problem. Ämnen som tas upp är:
- Loggning: Strukturerade loggar som skrivits till .NET-loggning. ILogger används av appramverk för att skriva loggar och av användare för sin egen loggning i en app.
-
Mått: Representation av datamått över tidsintervall, till exempel begäranden per sekund. Mått genereras med hjälp av
EventCounteroch kan observeras med hjälp av kommandoradsverktyget dotnet-counters eller med Application Insights. -
DiagnosticSource:
DiagnosticSourceär en mekanism för loggning under produktionstid med omfattande datanyttolaster för användning inom processen. Till skillnad från loggning, som förutsätter att data lämnar processen och förväntar sig serialiserbara data,DiagnosticSourcefungerar det bra med komplexa data.
Logging
Precis som de flesta komponenter i ASP.NET Core används KestrelMicrosoft.Extensions.Logging för att generera logginformation.
Kestrel använder sig av flera kategorier som gör att du kan vara selektiv på vilka loggar du lyssnar på.
| Namn på loggningskategori | Logghändelser |
|---|---|
Microsoft.AspNetCore.Server.Kestrel |
ApplicationError, ConnectionHeadResponseBodyWrite, ApplicationNeverCompleted, RequestBodyStart, RequestBodyDone, RequestBodyNotEntirelyRead, , RequestBodyDrainTimedOut, ResponseMinimumDataRateNotSatisfied, , InvalidResponseHeaderRemovedHeartbeatSlow |
Microsoft.AspNetCore.Server.Kestrel.BadRequests |
ConnectionBadRequest
RequestProcessingError
RequestBodyMinimumDataRateNotSatisfied
|
Microsoft.AspNetCore.Server.Kestrel.Connections |
ConnectionAccepted, ConnectionStart, ConnectionStop, ConnectionPause, ConnectionResume, ConnectionKeepAlive, , ConnectionRejected, ConnectionDisconnect, NotAllConnectionsClosedGracefully, , , NotAllConnectionsAbortedApplicationAbortedConnection |
Microsoft.AspNetCore.Server.Kestrel.Http2 |
Http2ConnectionError, Http2ConnectionClosing, Http2ConnectionClosed, Http2StreamError, Http2StreamResetAbort, HPackDecodingError, , HPackEncodingError, Http2FrameReceived, , Http2FrameSendingHttp2MaxConcurrentStreamsReached |
Microsoft.AspNetCore.Server.Kestrel.Http3 |
Http3ConnectionError, Http3ConnectionClosing, Http3ConnectionClosed, Http3StreamAbort, Http3FrameReceivedHttp3FrameSending |
Loggning av anslutningar
Kestrel stöder också möjligheten att generera Debug nivåloggar för kommunikation på bytenivå och kan aktiveras per slutpunkt. För att aktivera anslutningsloggning, se konfigurera slutpunkter för Kestrel
Metrics
Mått är en representation av datamått över tidsintervall, till exempel begäranden per sekund. Måttdata gör det möjligt att övervaka tillståndet för en app på hög nivå.
Kestrel mätvärden genereras med hjälp av EventCounter.
Note
Räknarna connections-per-second och tls-handshakes-per-second namnges felaktigt. Räknarna:
- Innehåller inte alltid antalet nya anslutningar eller TLS-handskakningar per sekund
- Visa antalet nya anslutningar eller TLS-handskakningar under det senaste uppdateringsintervallet, som begärts av händelsekonsumenten via
EventCounterIntervalSec-argumentet ifilterPayloadtillKestrelEventSource.
Vi rekommenderar att konsumenter av dessa räknare skalar måttvärdet baserat på DisplayRateTimeScale en sekund.
| Name | Visningsnamn | Description |
|---|---|---|
connections-per-second |
Anslutningshastighet | Antalet nya inkommande anslutningar per uppdateringsintervall |
total-connections |
Totalt antal anslutningar | Det totala antalet anslutningar |
tls-handshakes-per-second |
TLS-handskakningshastighet | Antalet nya TLS-handskakningar per uppdateringsintervall |
total-tls-handshakes |
Totalt antal TLS-handskakningar | Det totala antalet TLS-handskakningar |
current-tls-handshakes |
Aktuella TLS-handskakningar | Antalet TLS-handskakningar i processen |
failed-tls-handshakes |
Misslyckade TLS-handskakningar | Det totala antalet misslyckade TLS-handskakningar |
current-connections |
Aktuella anslutningar | Det totala antalet anslutningar, inklusive inaktiva anslutningar |
connection-queue-length |
Längd på anslutningskö | Det totala antalet anslutningar i kö till trådpoolen. I ett felfritt system i stabilt tillstånd bör det här talet alltid vara nära noll |
request-queue-length |
Längd på begärandekö | Det totala antalet begäranden i kö till trådpoolen. I ett felfritt system i stabilt tillstånd bör det här talet alltid vara nära noll. Det här måttet skiljer sig från IIS/Http.Sys-begärandekön och kan inte jämföras |
current-upgraded-requests |
Aktuella uppgraderade begäranden (WebSockets) | Antalet aktiva WebSocket-begäranden |
DiagnosticSource
Kestrel genererar en DiagnosticSource händelse för HTTP-begäranden som avvisas på servernivå, till exempel felaktiga begäranden och protokollöverträdelser. Därför kommer dessa begäranden aldrig in i värdlagret i ASP.NET Core.
Kestrel genererar dessa händelser med Microsoft.AspNetCore.Server.Kestrel.BadRequest händelsenamnet och en IFeatureCollection som objektnyttolast. Det underliggande undantaget kan hämtas genom att komma åt IBadRequestExceptionFeature i funktionssamlingen.
Att lösa dessa händelser är en tvåstegsprocess. En övervakare för DiagnosticListener måste skapas:
class BadRequestEventListener : IObserver<KeyValuePair<string, object>>, IDisposable
{
private readonly IDisposable _subscription;
private readonly Action<IBadRequestExceptionFeature> _callback;
public BadRequestEventListener(DiagnosticListener diagnosticListener, Action<IBadRequestExceptionFeature> callback)
{
_subscription = diagnosticListener.Subscribe(this!, IsEnabled);
_callback = callback;
}
private static readonly Predicate<string> IsEnabled = (provider) => provider switch
{
"Microsoft.AspNetCore.Server.Kestrel.BadRequest" => true,
_ => false
};
public void OnNext(KeyValuePair<string, object> pair)
{
if (pair.Value is IFeatureCollection featureCollection)
{
var badRequestFeature = featureCollection.Get<IBadRequestExceptionFeature>();
if (badRequestFeature is not null)
{
_callback(badRequestFeature);
}
}
}
public void OnError(Exception error) { }
public void OnCompleted() { }
public virtual void Dispose() => _subscription.Dispose();
}
Prenumerera på ASP.NET Core DiagnosticListener med observatören. I detta exempel skapar vi en callback som loggar det underliggande undantaget.
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
var diagnosticSource = app.Services.GetRequiredService<DiagnosticListener>();
using var badRequestListener = new BadRequestEventListener(diagnosticSource, (badRequestExceptionFeature) =>
{
app.Logger.LogError(badRequestExceptionFeature.Error, "Bad request received");
});
app.MapGet("/", () => "Hello world");
app.Run();
Beteende med felsökningsprogrammet anslutet
Vissa tidsgränser och hastighetsgränser tillämpas inte när ett felsökningsprogram är kopplat till en Kestrel process. Mer information finns i Beteende med felsökningsprogram kopplat.
ASP.NET Core