Aracılığıyla paylaş


ASP.NET Core'da günlüğe kaydetme ve tanılama SignalR

Tarafından Andrew Stanton-Nurse

Bu makalede, sorunları gidermeye yardımcı olmak için ASP.NET Core SignalR uygulamanızdan tanılama toplamaya yönelik yönergeler sağlanır.

Sunucu tarafı günlüğü

Uyarı

Sunucu tarafı günlükleri, uygulamanızdan hassas bilgiler içerebilir. Üretim uygulamalarından GitHub gibi genel forumlara asla ham günlük göndermeyin.

SignalR ASP.NET Core'un bir parçası olduğundan ASP.NET Core günlük sistemini kullanır. Varsayılan yapılandırmada, SignalR en az bilgiyi günlüğe kaydeder, ancak günlük düzeyi yapılandırılabilir. ASP.NET Core günlüğünü yapılandırma hakkında ayrıntılı bilgi için ASP.NET Core günlüğü belgelerine bakın.

SignalR iki günlükçü kategorisi kullanır:

  • Microsoft.AspNetCore.SignalR: Hub Protokolleri, Hub'ları etkinleştirme, çağırma yöntemleri ve Hub ile ilgili diğer etkinliklerle ilgili günlükler için.
  • Microsoft.AspNetCore.Http.Connections: WebSockets, Long Polling, Server-Sent Events ve alt düzey SignalR altyapı gibi aktarımlarla ilgili günlükler için.

Ayrıntılı günlükleri SignalR öğesinden etkinleştirmek için, dosyanızdaki Debug alt bölümüne aşağıdaki öğeleri ekleyerek önceki appsettings.json ön eklerin her ikisini de LogLevel düzeyinde Logging yapılandırın.

{
    "Logging": {
        "LogLevel": {
            "Default": "Debug",
            "System": "Information",
            "Microsoft": "Information",
            "Microsoft.AspNetCore.SignalR": "Debug",
            "Microsoft.AspNetCore.Http.Connections": "Debug"
        }
    }
}

Günlükçü kategorileri için SignalR günlük düzeyleri, yöntemindeki CreateWebHostBuilder kodda da yapılandırılabilir:

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .ConfigureLogging(logging =>
        {
            logging.AddFilter("Microsoft.AspNetCore.SignalR", LogLevel.Debug);
            logging.AddFilter("Microsoft.AspNetCore.Http.Connections", LogLevel.Debug);
        })
        .UseStartup<Startup>();

JSON tabanlı yapılandırma kullanmıyorsanız yapılandırma sisteminizde aşağıdaki yapılandırma değerlerini ayarlayın:

  • Logging:LogLevel:Microsoft.AspNetCore.SignalR = Debug
  • Logging:LogLevel:Microsoft.AspNetCore.Http.Connections = Debug

İç içe yapılandırma değerlerinin nasıl belirtileceğini belirlemek için yapılandırma sisteminizin belgelerine bakın. Örneğin, ortam değişkenleri kullanılırken yerine iki _ karakter kullanılır : (örneğin, Logging__LogLevel__Microsoft.AspNetCore.SignalR).

Uygulamanız için daha ayrıntılı tanılamalar toplarken düzeyi kullanmanızı Debug öneririz. Düzeyi Trace düşük düzeyli tanılamalar oluşturur ve uygulamanızdaki sorunları tanılamak için nadiren gereklidir.

Sunucu tarafı günlüklerine erişme

Sunucu tarafı günlüklerine nasıl erişildiği, uygulamanın çalıştığı ortama bağlıdır.

IIS dışında bir konsol uygulaması olarak

Konsol uygulamasında çalıştırıyorsanız Konsol günlükçüsunun varsayılan olarak etkinleştirilmesi gerekir. SignalR günlükleri konsolda görünür.

Visual Studio'dan IIS Express içinde

Visual Studio, çıkış penceresinde günlük çıkışını görüntüler. ASP.NET Çekirdek Web Sunucusu açılan seçeneğini belirleyin.

Azure App Service

Azure Uygulaması Hizmeti portalının Tanılama günlükleri bölümünde Uygulama Günlüğü (Dosya Sistemi) seçeneğini etkinleştirin ve Düzeyi. Günlükler, Günlük akışı hizmetinden ve App Service'in dosya sistemindeki günlüklerde kullanılabilir olmalıdır. Daha fazla bilgi için bkz . Azure günlük akışı.

Diğer ortamlar

Docker, Kubernetes veya Windows Hizmetleri gibi farklı dağıtım ortamlarına uygun log sağlayıcılarını yapılandırma hakkında daha fazla bilgi için bkz. .NET Core ve ASP.NET Core'da günlük kaydı.

JavaScript istemci günlüğü

Uyarı

İstemci tarafı günlükleri, uygulamanızdan hassas bilgiler içerebilir. Üretim uygulamalarından GitHub gibi genel forumlara asla ham günlük göndermeyin.

JavaScript istemcisini kullanırken, üzerinde configureLoggingyöntemini kullanarak HubConnectionBuilder günlük seçeneklerini yapılandırabilirsiniz:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/my/hub/url")
    .configureLogging(signalR.LogLevel.Debug)
    .build();

yönteminde signalR.LogLevel.None belirterek configureLogging çerçeve günlüğünü devre dışı bırakın. Bazı günlüklerin doğrudan tarayıcı tarafından yayıldığını ve günlük düzeyi ayarlanarak devre dışı bırakılmadığını unutmayın.

Aşağıdaki tabloda JavaScript istemcisi tarafından kullanılabilen günlük düzeyleri gösterilmektedir. Günlük düzeyinin bu değerlerden birine ayarlanması, bu düzeyde ve tablonun üzerindeki tüm düzeylerde günlüğe kaydetmeyi sağlar.

Seviye Açıklama
None Hiçbir ileti günlüğe kaydedilmez.
Critical Uygulamanın tamamında hata olduğunu belirten iletiler.
Error Geçerli işlemde bir hata olduğunu belirten iletiler.
Warning Önemli olmayan bir sorunu gösteren iletiler.
Information Bilgilendiren iletiler.
Debug Hata ayıklama için yararlı tanılama iletileri.
Trace Belirli sorunları tanılamak için tasarlanmış çok ayrıntılı tanılama iletileri.

Ayrıntı düzeyini yapılandırdıktan sonra günlükler Tarayıcı Konsolu'na (veya NodeJS uygulamasında Standart Çıkış) yazılır.

Günlükleri özel bir günlüğe kaydetme sistemine göndermek istiyorsanız arabirimi uygulayan ILogger bir JavaScript nesnesi sağlayabilirsiniz. Uygulanması gereken tek yöntem, olay düzeyini ve olayla ilişkili iletiyi alan yöntemidir log. Örneğin:

import { ILogger, LogLevel, HubConnectionBuilder } from "@microsoft/signalr";

export class MyLogger implements ILogger {
    log(logLevel: LogLevel, message: string) {
        // Use `message` and `logLevel` to record the log message to your own system
    }
}

// later on, when configuring your connection...

let connection = new HubConnectionBuilder()
    .withUrl("/my/hub/url")
    .configureLogging(new MyLogger())
    .build();
import { ILogger, LogLevel, HubConnectionBuilder } from "@aspnet/signalr";

export class MyLogger implements ILogger {
    log(logLevel: LogLevel, message: string) {
        // Use `message` and `logLevel` to record the log message to your own system
    }
}

// later on, when configuring your connection...

let connection = new HubConnectionBuilder()
    .withUrl("/my/hub/url")
    .configureLogging(new MyLogger())
    .build();

.NET istemci günlüğü

Uyarı

İstemci tarafı günlükleri, uygulamanızdan hassas bilgiler içerebilir. Üretim uygulamalarından GitHub gibi genel forumlara asla ham günlük göndermeyin.

.NET istemcisinden günlükleri almak için üzerinde ConfigureLoggingyöntemini kullanabilirsinizHubConnectionBuilder. Bu, ve ConfigureLoggingüzerindeki WebHostBuilder yöntemiyle HostBuilder aynı şekilde çalışır. ASP.NET Core'da kullandığınız günlük sağlayıcılarının aynısını yapılandırabilirsiniz. Ancak, tek tek günlük sağlayıcıları için NuGet paketlerini el ile yüklemeniz ve etkinleştirmeniz gerekir.

Bir Blazor WebAssembly uygulamaya .NET istemci günlüğü eklemek için bkz . ASP.NET Çekirdek Blazor günlüğü.

Konsol günlüğü

Konsol günlüğünü etkinleştirmek için Microsoft.Extensions.Logging.Console paketini ekleyin. Ardından konsol günlükçüsüsü AddConsole yapılandırmak için yöntemini kullanın:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/my/hub/url")
    .ConfigureLogging(logging =>
    {
        // Log to the Console
        logging.AddConsole();

        // This will set ALL logging to Debug level
        logging.SetMinimumLevel(LogLevel.Debug);
    })
    .Build();

Çıkış penceresi günlüğünde hata ayıklama

Günlükler Visual Studio'da Çıkış penceresine gidecek şekilde yapılandırılabilir. Microsoft.Extensions.Logging.Debug paketini yükleyin ve yöntemini kullanınAddDebug:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/my/hub/url")
    .ConfigureLogging(logging =>
    {
        // Log to the Output Window
        logging.AddDebug();

        // This will set ALL logging to Debug level
        logging.SetMinimumLevel(LogLevel.Debug)
    })
    .Build();

Diğer günlük sağlayıcıları

SignalR Serilog, Seq, NLog gibi diğer günlük sağlayıcılarını veya ile Microsoft.Extensions.Loggingtümleşen diğer günlük sistemlerini destekler. Günlük sisteminiz bir ILoggerProvidersağlıyorsa ile AddProviderkaydedebilirsiniz:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/my/hub/url")
    .ConfigureLogging(logging =>
    {
        // Log to your custom provider
        logging.AddProvider(new MyCustomLoggingProvider());

        // This will set ALL logging to Debug level
        logging.SetMinimumLevel(LogLevel.Debug)
    })
    .Build();

Ayrıntı düzeyini denetleme

Uygulamadaki diğer yerlerden oturum açarken varsayılan düzeyin Debug olarak değiştirilmesi çok ayrıntılı olabilir. Bir Filtre, SignalR günlükleri için günlük seviyesini yapılandırmak amacıyla kullanılabilir. Bu, kodda, sunucudakiyle aynı şekilde yapılabilir:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/my/hub/url")
    .ConfigureLogging(logging =>
    {
        // Register your providers

        // Set the default log level to Information, but to Debug for SignalR-related loggers.
        logging.SetMinimumLevel(LogLevel.Information);
        logging.AddFilter("Microsoft.AspNetCore.SignalR", LogLevel.Debug);
        logging.AddFilter("Microsoft.AspNetCore.Http.Connections", LogLevel.Debug);
    })
    .Build();

İzleme: SignalR

SignalR hub sunucusu ve SignalR istemcisi, SignalR ve DiagnosticSource kullanarak Activity bağlantılar ve iletiler hakkında bilgi sağlar. SignalR hem merkez sunucusu hem de istemci için .NET 9 ile başlayan bir ActivitySource'a sahiptir.

ActivitySource, uygulamanızdaki işlemleri temsil eden etkinlikleri (veya yayılma alanlarını) oluşturmak ve yönetmek için dağıtılmış izlemede kullanılan bir bileşendir. Bu etkinlikler şunları yapmak için kullanılabilir:

  • Farklı bileşenler ve hizmetler arasında istek ve işlem akışını izleyin.
  • Uygulamanızın performansı ve davranışı hakkında değerli içgörüler sağlayın.

.NET SignalR sunucusu ActivitySource

SignalR olarak adlandırılan Microsoft.AspNetCore.SignalR.Server ActivitySource, hub metodu çağrıları için olayları tetikler.

  • Her yöntem kendi etkinliğidir, bu nedenle hub yöntemi çağrısı sırasında bir etkinlik yayan her şey hub yöntemi etkinliğinin altındadır.
  • Hub metodu etkinliklerinin ebeveyni yoktur. Bu, uzun süre çalışan SignalR bağlantı altında paketlenmemiş oldukları anlamına gelir.

Aşağıdaki örnek, .NET Aspire gösterge paneli ve OpenTelemetry paketlerini kullanır:

<PackageReference Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.9.0" />
<PackageReference Include="OpenTelemetry.Extensions.Hosting" Version="1.9.0" />
<PackageReference Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.9.0" />

Dosyaya aşağıdaki başlangıç kodunu Program.cs ekleyin:

using OpenTelemetry.Trace;
using SignalRChat.Hubs;

// Set OTEL_EXPORTER_OTLP_ENDPOINT environment variable depending on where your OTEL endpoint is.
var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.Services.AddSignalR();

builder.Services.AddOpenTelemetry()
    .WithTracing(tracing =>
    {
        if (builder.Environment.IsDevelopment())
        {
            // View all traces only in development environment.
            tracing.SetSampler(new AlwaysOnSampler());
        }

        tracing.AddAspNetCoreInstrumentation();
        tracing.AddSource("Microsoft.AspNetCore.SignalR.Server");
    });

builder.Services.ConfigureOpenTelemetryTracerProvider(tracing => tracing.AddOtlpExporter());

var app = builder.Build();

Aşağıdaki örnek çıkış Aspire Panosu'ndan alınmaktadır:

Hub yöntemi çağrı olayları için SignalR etkinlik listesi

ASP.NET Core, etkinlik kaynağında kendi ölçümlerini de sağlar.

.NET SignalR istemcisi ActivitySource

SignalR ActivitySource adlı Microsoft.AspNetCore.SignalR.Client, bir SignalR istemcisi için olaylar yayımlar.

  • Hub çağrıları bir istemci yayılma alanı oluşturur. JavaScript istemcisi gibi diğer SignalR istemciler izlemeyi desteklemez. Bu özellik, gelecek sürümlerde daha fazla istemciye eklenecektir.
  • İstemci ve sunucudaki hub çağrıları bağlam yaymadestekler. İzleme bağlamını yaymak, gerçek dağıtılmış izlemeyi etkinleştirir. Artık çağrıların istemciden sunucuya ve geriye doğru akışını görmek mümkündür.

İşte bu yeni etkinliklerin .NET Aspire kontrol panelinde nasıl göründüğü:

Aspire panosunda SignalR dağıtılmış izleme

Ağ izlemeleri

Uyarı

Ağ izlemesi, uygulamanız tarafından gönderilen her iletinin tam içeriğini içerir. Üretim uygulamalarından ham ağ izlemelerini Asla GitHub gibi genel forumlara göndermeyin.

Bir sorunla karşılaşırsanız, ağ izlemesi bazen değerli bilgiler sağlayabilir. Bu, özellikle sorun takip sistemimizde bir sorun kaydederken çok yardımcı olur.

Fiddler ile ağ izlemesi toplama (tercih edilen seçenek)

Bu yöntem tüm uygulamalarda çalışır.

Fiddler, HTTP izlemelerini toplamak için güçlü bir araçtır. telerik.com/fiddler'den yükleyin, başlatın ve uygulamanızı çalıştırın ve sorunu yeniden oluşturun. Fiddler, Windows için kullanılabilir ve macOS ve Linux için beta sürümleri vardır.

HTTPS kullanarak bağlanırsanız, Fiddler'ın HTTPS trafiğinin şifresini çözebilmesini sağlamak için bazı ek adımlar vardır. Daha fazla bilgi için Fiddler belgelerine bakın.

İzlemeyi topladıktan sonra menü çubuğundan Dosya>Kaydet>Tüm Oturumları seçerek dışarı aktarın

Fiddler'dan tüm oturumları dışarı aktarma

tcpdump ile ağ izlemesi toplama (yalnızca macOS ve Linux)

Bu yöntem tüm uygulamalarda çalışır.

Ham TCP izlemeleri, bir komut kabuğundan aşağıdaki komut çalıştırılarak tcpdump kullanılarak toplanabilir. bir izin hatası alırsanız komutunun root başına sudo veya ön eki eklemeniz gerekebilir:

tcpdump -i [interface] -w trace.pcap

değerini yakalamak istediğiniz ağ arabirimiyle değiştirin [interface] . Bu genellikle (standart ethernet arabirimi için) veya /dev/eth0 (localhost trafiği için) gibi /dev/lo0 bir şeydir. Daha fazla bilgi için konak sisteminizdeki tcpdump el kitabı sayfasına bakın.

Tarayıcıda ağ izlemesi toplama

Bu yöntem yalnızca tarayıcı tabanlı uygulamalarda çalışır.

Çoğu tarayıcı geliştirici aracı konsolunun, tarayıcı ile sunucu arasında ağ etkinliğinin yakalanmasına olanak tanıyan bir "Ağ" sekmesi vardır. Ancak, bu izlemeler WebSocket ve Sunucu Tarafından Gönderilen Olay iletilerini içermez. Bu aktarımları kullanırken, bu makalenin devamında açıklandığı gibi Fiddler veya TcpDump gibi bir araç kullanmak daha iyi bir yaklaşımdır.

Microsoft Edge ve Internet Explorer

(Yönergeler hem Microsoft Edge hem de Internet Explorer için aynıdır)

  1. F12 tuşuna basarak Geliştirme Araçları'nı açın
  2. Ağ Sekmesini seçin
  3. Sayfayı yenileyin (gerekirse) ve sorunu yeniden oluşturun
  4. İzlemeyi "HAR" dosyası olarak dışarı aktarmak için araç çubuğundaki Kaydet simgesini seçin:

Microsoft Edge Geliştirme Araçları Ağ Sekmesindeki Kaydet Simgesi

Google Chrome

  1. F12 tuşuna basarak Geliştirme Araçları'nı açın
  2. Ağ Sekmesini seçin
  3. Sayfayı yenileyin (gerekirse) ve sorunu yeniden oluşturun
  4. İstek listesinde herhangi bir yere sağ tıklayın ve "İçerikle HAR olarak kaydet"i seçin:

Google Chrome Geliştirme Araçları Ağ Sekmesinde

Mozilla Firefox

  1. F12 tuşuna basarak Geliştirme Araçları'nı açın
  2. Ağ Sekmesini seçin
  3. Sayfayı yenileyin (gerekirse) ve sorunu yeniden oluşturun
  4. İstek listesinde herhangi bir yere sağ tıklayın ve "Tümünü HAR Olarak Kaydet" seçeneğini belirleyin

Mozilla Firefox Geliştirme Araçları Ağ Sekmesinde

GitHub sorunlarına tanılama dosyaları ekleme

Tanılama dosyalarını GitHub sorunlarına eklemek için önce bunların adlarını değiştirerek .txt uzantısına sahip olmalarını sağlayın, ardından dosyaları sürükleyip sorunun üzerine bırakın.

Not

Lütfen günlük dosyalarının veya ağ izlemelerinin içeriğini GitHub sorununa yapıştırmayın. Bu günlükler ve izlemeler büyük olabilir ve GitHub genellikle bunları kısaltmaktadır.

GitHub sorununa günlük dosyalarını sürükleme

Ölçümler

Ölçümler, zaman aralıkları içindeki veri ölçülerinin bir gösterimidir. Örneğin, saniye başına istek sayısı. Ölçüm verileri, bir uygulamanın durumunun yüksek düzeyde gözlemlenmesine olanak tanır. .NET gRPC ölçümleri kullanılarak EventCountergönderilir.

SignalR sunucu ölçümleri

SignalR sunucu ölçümleri olay kaynağında Microsoft.AspNetCore.Http.Connections bildirilir.

Veri Akışı Adı Açıklama
connections-started Başlatılan toplam bağlantı sayısı
connections-stopped Durdurulan toplam bağlantı sayısı
connections-timed-out Toplam bağlantı zaman aşımına uğradı
current-connections Geçerli bağlantılar
connections-duration Ortalama bağlantı süresi

Ölçümleri gözlemleme

dotnet-counters , geçici sistem durumu izleme ve birinci düzey performans araştırması için bir performans izleme aracıdır. Sağlayıcı adı olarak ile Microsoft.AspNetCore.Http.Connections bir .NET uygulamasını izleyin. Örneğin:

> dotnet-counters monitor --process-id 37016 --counters Microsoft.AspNetCore.Http.Connections

Press p to pause, r to resume, q to quit.
    Status: Running
[Microsoft.AspNetCore.Http.Connections]
    Average Connection Duration (ms)       16,040.56
    Current Connections                         1
    Total Connections Started                   8
    Total Connections Stopped                   7
    Total Connections Timed Out                 0

Ek kaynaklar