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 çok SignalR az bilgi günlüğe kaydeder, ancak bu 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.

öğesinden SignalRayrıntılı günlükleri etkinleştirmek için, dosyasındaki alt bölüme Debug aşağıdaki öğeleri ekleyerek önceki ön eklerin her ikisini de Loggingdosyanızdaki appsettings.json düzeye LogLevel yapılandırın:

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

Bunu yönteminizdeki CreateWebHostBuilder kodda da yapılandırabilirsiniz:

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>();

ON tabanlı yapılandırma kullanmıyorsanız JSyapı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. Trace Düzeyi çok düşük düzeyde 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şebileceğiniz, çalıştırdığınız 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 konsolunda 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 olarak Verboseyapılandırın. 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

Uygulama başka bir ortama (örneğin Docker, Kubernetes veya Windows Hizmeti) dağıtıldıysa, ortama uygun günlük sağlayıcılarını yapılandırma hakkında daha fazla bilgi için bkz . .NET Core'da oturum açma ve ASP.NET Core .

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 HubConnectionBuilderyöntemini kullanarak configureLogging günlük seçeneklerini yapılandırabilirsiniz:

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

Çerçeve günlüğünü devre dışı bırakmak için yönteminde belirtin signalR.LogLevel.NoneconfigureLogging . 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.

Level Tanım
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 Bir 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. Örnek:

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 HubConnectionBuilderyöntemini kullanabilirsinizConfigureLogging. Bu, ve HostBuilderüzerindeki WebHostBuilder yöntemiyle ConfigureLogging 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ükleri, Visual Studio'da Çıkış penceresine gidecek şekilde de yapılandırabilirsiniz. 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

Uygulamanızdaki diğer yerlerden oturum açıyorsanız, varsayılan düzeyin Debug olarak değiştirilmesi çok ayrıntılı olabilir. Günlükler için günlük düzeyini yapılandırmak için SignalR Filtre kullanabilirsiniz. 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();

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 birçok yararlı bilgi sağlayabilir. Bu özellikle sorun izleyicimizde bir sorun bildirecekseniz kullanışlıdır.

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

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

Fiddler, HTTP izlemelerini toplamak için çok 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 ayrıntı için Fiddler belgelerine bakın.

İzlemeyi topladıktan sonra, menü çubuğundan Dosya>Tüm Oturumları Kaydet'i>seçerek izlemeyi dışarı aktarabilirsiniz.

Exporting all sessions from Fiddler

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

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

Bir komut kabuğundan aşağıdaki komutu çalıştırarak tcpdump kullanarak ham TCP izlemeleri toplayabilirsiniz. bir izin hatası alırsanız komutunun sudo başına root 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 arabiriminiz için) veya /dev/lo0 (localhost trafiği için) gibi /dev/eth0 bir şeydir. Daha fazla bilgi için konak sisteminizdeki erkek sayfasına bakın tcpdump .

Tarayıcıda ağ izlemesi toplama

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

Çoğu tarayıcı geliştirici aracı konsolu, tarayıcı ile sunucu arasındaki ağ etkinliğini yakalamanızı sağlayan bir "Ağ" sekmesine sahiptir. Ancak, bu izlemeler WebSocket ve Sunucu Tarafından Gönderilen Olay iletilerini içermez. Bu aktarımları kullanıyorsanız, Fiddler veya TcpDump gibi bir araç kullanmak (aşağıda açıklanmıştır) daha iyi bir yaklaşımdır.

Microsoft Edge ve Internet Explorer

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

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

The Save Icon on the Microsoft Edge Dev Tools Network Tab

Google Chrome

  1. Geliştirme Araçları'nı açmak için F12 tuşuna basın
  2. Ağ Sekmesine tıklayın
  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:

Mozilla Firefox

  1. Geliştirme Araçları'nı açmak için F12 tuşuna basın
  2. Ağ Sekmesine tıklayın
  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

GitHub sorunlarına tanılama dosyaları ekleme

Tanılama dosyalarını GitHub sorunlarına eklemek için uzantıya sahip .txt olmalarını ve ardından sürükleyip soruna bırakmalarını sağlayabilirsiniz.

Dekont

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 oldukça büyük olabilir ve GitHub genellikle bunları kesebilir.

Dragging log files on to a GitHub issue

Ö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.

Dosya Adı Tanım
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. Örnek:

> dotnet-counters monitor --process-id 37016 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