Bagikan melalui


Pengelogan dan diagnostik di ASP.NET Core SignalR

Oleh Andrew Stanton-Perawat

Artikel ini menyediakan panduan untuk mengumpulkan diagnostik dari aplikasi ASP.NET Core SignalR Anda untuk membantu memecahkan masalah.

Pengelogan sisi server

Peringatan

Log sisi server mungkin berisi informasi sensitif dari aplikasi Anda. Jangan pernah memposting log mentah dari aplikasi produksi ke forum publik seperti GitHub.

Karena SignalR merupakan bagian dari ASP.NET Core, ia menggunakan sistem pengelogan ASP.NET Core. Dalam konfigurasi default, SignalR mencatat informasi yang sangat sedikit, tetapi ini dapat dikonfigurasi. Lihat dokumentasi tentang pengelogan ASP.NET Core untuk detail tentang mengonfigurasi pengelogan ASP.NET Core.

SignalR menggunakan dua kategori pencatat:

  • Microsoft.AspNetCore.SignalR: Untuk log yang terkait dengan Protokol Hub, mengaktifkan Hub, memanggil metode, dan aktivitas terkait Hub lainnya.
  • Microsoft.AspNetCore.Http.Connections: Untuk log yang terkait dengan transportasi, seperti WebSockets, Long Polling, Server-Sent Events, dan infrastruktur tingkat SignalR rendah.

Untuk mengaktifkan log terperinci dari SignalR, konfigurasikan kedua awalan sebelumnya ke Debug tingkat dalam file Anda appsettings.json dengan menambahkan item berikut ke sub-bagian LogLevel di Logging:

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

Anda juga dapat mengonfigurasi ini dalam kode dalam metode Anda CreateWebHostBuilder :

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

Jika Anda tidak menggunakan konfigurasi berbasis JSON, atur nilai konfigurasi berikut dalam sistem konfigurasi Anda:

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

Periksa dokumentasi untuk sistem konfigurasi Anda untuk menentukan cara menentukan nilai konfigurasi berlapis. Misalnya, saat menggunakan variabel lingkungan, dua _ karakter digunakan alih-alih : (misalnya, Logging__LogLevel__Microsoft.AspNetCore.SignalR).

Sebaiknya gunakan Debug tingkat saat mengumpulkan diagnostik yang lebih rinci untuk aplikasi Anda. Tingkat ini Trace menghasilkan diagnostik tingkat yang sangat rendah dan jarang diperlukan untuk mendiagnosis masalah di aplikasi Anda.

Mengakses log sisi server

Cara Anda mengakses log sisi server bergantung pada lingkungan tempat Anda menjalankan.

Sebagai aplikasi konsol di luar IIS

Jika Anda berjalan di aplikasi konsol, pencatat Konsol harus diaktifkan secara default. SignalR log akan muncul di konsol.

Dalam IIS Express dari Visual Studio

Visual Studio menampilkan output log di jendela Output . Pilih opsi drop-down ASP.NET Core Web Server.

Azure App Service

Aktifkan opsi Pengelogan Aplikasi (Filesystem) di bagian Log diagnostik portal Azure App Service dan konfigurasikan Tingkat ke Verbose. Log harus tersedia dari layanan streaming Log dan log pada sistem file App Service. Untuk informasi selengkapnya, lihat Streaming log Azure.

Lingkungan lainnya

Jika aplikasi disebarkan ke lingkungan lain (misalnya, Docker, Kubernetes, atau Windows Service), lihat Pengelogan di .NET Core dan ASP.NET Core untuk informasi selengkapnya tentang cara mengonfigurasi penyedia pengelogan yang cocok untuk lingkungan.

Pengelogan klien JavaScript

Peringatan

Log sisi klien mungkin berisi informasi sensitif dari aplikasi Anda. Jangan pernah memposting log mentah dari aplikasi produksi ke forum publik seperti GitHub.

Saat menggunakan klien JavaScript, Anda dapat mengonfigurasi opsi pengelogan configureLogging menggunakan metode pada HubConnectionBuilder:

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

Untuk menonaktifkan pengelogan kerangka kerja, tentukan signalR.LogLevel.None dalam configureLogging metode . Perhatikan bahwa beberapa pengelogan dipancarkan langsung oleh browser dan tidak dapat dinonaktifkan melalui pengaturan tingkat log.

Tabel berikut ini memperlihatkan tingkat log yang tersedia untuk klien JavaScript. Mengatur tingkat log ke salah satu nilai ini memungkinkan pengelogan pada tingkat tersebut dan semua tingkat di atasnya dalam tabel.

Tingkat Deskripsi
None Tidak ada pesan yang dicatat.
Critical Pesan yang menunjukkan kegagalan di seluruh aplikasi.
Error Pesan yang menunjukkan kegagalan dalam operasi saat ini.
Warning Pesan yang menunjukkan masalah yang tidak fatal.
Information Pesan informasi.
Debug Pesan diagnostik berguna untuk penelusuran kesalahan.
Trace Pesan diagnostik yang sangat rinci yang dirancang untuk mendiagnosis masalah tertentu.

Setelah Anda mengonfigurasi verbositas, log akan ditulis ke Konsol Browser (atau Output Standar di aplikasi NodeJS).

Jika Anda ingin mengirim log ke sistem pengelogan kustom, Anda dapat menyediakan objek JavaScript yang mengimplementasikan ILogger antarmuka. Satu-satunya metode yang perlu diimplementasikan adalah log, yang mengambil tingkat peristiwa dan pesan yang terkait dengan peristiwa. Contohnya:

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

Pengelogan klien .NET

Peringatan

Log sisi klien mungkin berisi informasi sensitif dari aplikasi Anda. Jangan pernah memposting log mentah dari aplikasi produksi ke forum publik seperti GitHub.

Untuk mendapatkan log dari klien .NET, Anda dapat menggunakan ConfigureLogging metode pada HubConnectionBuilder. Ini bekerja dengan cara yang sama seperti ConfigureLogging metode pada WebHostBuilder dan HostBuilder. Anda dapat mengonfigurasi penyedia pengelogan yang sama dengan yang Anda gunakan di ASP.NET Core. Namun, Anda harus menginstal dan mengaktifkan paket NuGet secara manual untuk masing-masing penyedia pengelogan.

Untuk menambahkan pengelogan klien .NET ke Blazor WebAssembly aplikasi, lihat pengelogan ASP.NET CoreBlazor.

Pengelogan konsol

Untuk mengaktifkan pengelogan Konsol, tambahkan paket Microsoft.Extensions.Logging.Console . Kemudian, gunakan AddConsole metode untuk mengonfigurasi pencatat konsol:

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

Pencatatan jendela output debug

Anda juga dapat mengonfigurasi log untuk masuk ke jendela Output di Visual Studio. Instal paket Microsoft.Extensions.Logging.Debug dan gunakan AddDebug metode :

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

Penyedia pengelogan lainnya

SignalR mendukung penyedia pengelogan lain seperti Serilog, Seq, NLog, atau sistem pengelogan lainnya yang terintegrasi dengan Microsoft.Extensions.Logging. Jika sistem pengelogan ILoggerProviderAnda menyediakan , Anda dapat mendaftarkannya dengan AddProvider:

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

Kontrol verbositas

Jika Anda pengelogan dari tempat lain di aplikasi Anda, mengubah tingkat Debug default menjadi mungkin terlalu verbose. Anda dapat menggunakan Filter untuk mengonfigurasi tingkat pengelogan untuk SignalR log. Ini dapat dilakukan dalam kode, dengan cara yang sama seperti di server:

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

Jejak jaringan

Peringatan

Jejak jaringan berisi konten lengkap dari setiap pesan yang dikirim oleh aplikasi Anda. Jangan pernah memposting jejak jaringan mentah dari aplikasi produksi ke forum publik seperti GitHub.

Jika Anda mengalami masalah, jejak jaringan terkadang dapat memberikan banyak informasi yang bermanfaat. Ini sangat berguna jika Anda akan mengajukan masalah pada pelacak masalah kami.

Mengumpulkan jejak jaringan dengan Fiddler (opsi pilihan)

Metode ini berfungsi untuk semua aplikasi.

Fiddler adalah alat yang sangat kuat untuk mengumpulkan jejak HTTP. Pasang dari telerik.com/fiddler, luncurkan, lalu jalankan aplikasi Anda dan ulangi masalahnya. Fiddler tersedia untuk Windows, dan ada versi beta untuk macOS dan Linux.

Jika Anda terhubung menggunakan HTTPS, ada beberapa langkah tambahan untuk memastikan Fiddler dapat mendekripsi lalu lintas HTTPS. Untuk detail selengkapnya, lihat dokumentasi Fiddler.

Setelah Anda mengumpulkan jejak, Anda dapat mengekspor jejak dengan memilih File>Simpan>Semua Sesi dari bilah menu.

Mengekspor semua sesi dari Fiddler

Kumpulkan jejak jaringan dengan tcpdump (khusus macOS dan Linux)

Metode ini berfungsi untuk semua aplikasi.

Anda dapat mengumpulkan jejak TCP mentah menggunakan tcpdump dengan menjalankan perintah berikut dari shell perintah. Anda mungkin harus root atau mengawali perintah dengan sudo jika Anda mendapatkan kesalahan izin:

tcpdump -i [interface] -w trace.pcap

Ganti [interface] dengan antarmuka jaringan yang ingin Anda ambil. Biasanya, ini seperti /dev/eth0 (untuk antarmuka Ethernet standar Anda) atau /dev/lo0 (untuk lalu lintas host lokal). Untuk informasi lebih lanjut, lihat tcpdump halaman manual pada sistem host Anda.

Mengumpulkan jejak jaringan dengan browser

Metode ini hanya berfungsi untuk aplikasi berbasis browser.

Sebagian besar konsol alat pengembang browser memiliki tab "Jaringan" yang memungkinkan Anda mengambil aktivitas jaringan antara browser dan server. Namun, jejak ini tidak menyertakan pesan WebSocket dan Peristiwa Terkirim Server. Jika Anda menggunakan transportasi tersebut, menggunakan alat seperti Fiddler atau TcpDump (dijelaskan di bawah) adalah pendekatan yang lebih baik.

Microsoft Edge dan Internet Explorer

(Instruksinya sama untuk Edge dan Internet Explorer)

  1. Tekan F12 untuk membuka Dev Tools
  2. Klik Tab Jaringan
  3. Refresh halaman (jika perlu) dan ulangi masalahnya
  4. Klik ikon Simpan di toolbar untuk mengekspor jejak sebagai file "HAR":

Ikon Simpan di Tab Jaringan Microsoft Edge Dev Tools

Google Chrome

  1. Tekan F12 untuk membuka Dev Tools
  2. Klik Tab Jaringan
  3. Refresh halaman (jika perlu) dan ulangi masalahnya
  4. Klik kanan di mana saja dalam daftar permintaan dan pilih "Simpan sebagai HAR dengan konten":

Opsi

Mozilla Firefox

  1. Tekan F12 untuk membuka Dev Tools
  2. Klik Tab Jaringan
  3. Refresh halaman (jika perlu) dan ulangi masalahnya
  4. Klik kanan di mana saja dalam daftar permintaan dan pilih "Simpan Semua Sebagai HAR"

Opsi

Lampirkan file diagnostik ke masalah GitHub

Anda dapat melampirkan file Diagnostik ke masalah GitHub dengan mengganti namanya sehingga mereka memiliki .txt ekstensi lalu menyeret dan menghilangkannya ke masalah.

Catatan

Jangan tempel konten file log atau jejak jaringan ke dalam masalah GitHub. Log dan jejak ini bisa cukup besar, dan GitHub biasanya memotongnya.

Menyeret file log ke masalah GitHub

Metrik

Metrik adalah representasi pengukuran data selama interval waktu. Misalnya, permintaan per detik. Data metrik memungkinkan pengamatan status aplikasi pada tingkat tinggi. Metrik .NET gRPC dipancarkan menggunakan EventCounter.

SignalR metrik server

SignalR metrik server dilaporkan pada Microsoft.AspNetCore.Http.Connections sumber peristiwa.

Nama Deskripsi
connections-started Total koneksi dimulai
connections-stopped Total koneksi dihentikan
connections-timed-out Total koneksi habis
current-connections Koneksi saat ini
connections-duration Durasi koneksi rata-rata

Mengamati metrik

penghitung dotnet adalah alat pemantauan performa untuk pemantauan kesehatan ad-hoc dan penyelidikan performa tingkat pertama. Pantau aplikasi .NET dengan Microsoft.AspNetCore.Http.Connections sebagai nama penyedia. Contohnya:

> 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

Sumber Daya Tambahan: