Bagikan melalui


Mengaktifkan Pelacakan SignalR

oleh Tom FitzMacken

Peringatan

Dokumentasi ini bukan untuk versi terbaru SignalR. Lihat ASP.NET Core SignalR.

Dokumen ini menjelaskan cara mengaktifkan dan mengonfigurasi pelacakan untuk server dan klien SignalR. Pelacakan memungkinkan Anda melihat informasi diagnostik tentang peristiwa di aplikasi SignalR Anda.

Topik ini awalnya ditulis oleh Patrick Fletcher.

Versi perangkat lunak yang digunakan dalam tutorial

Pertanyaan dan komentar

Silakan tinggalkan umpan balik tentang bagaimana Anda menyukai tutorial ini dan apa yang dapat kami tingkatkan di komentar di bagian bawah halaman. Jika Anda memiliki pertanyaan yang tidak terkait langsung dengan tutorial, Anda dapat mempostingnya ke forum ASP.NET SignalR atau StackOverflow.com.

Saat pelacakan diaktifkan, aplikasi SignalR membuat entri log untuk peristiwa. Anda dapat mencatat peristiwa dari klien dan server. Melacak koneksi log server, penyedia skala, dan peristiwa bus pesan. Melacak peristiwa koneksi log klien. Di SignalR 2.1 dan yang lebih baru, melacak klien mencatat konten lengkap pesan pemanggilan hub.

Konten

Mengaktifkan pelacakan pada server

Anda mengaktifkan pelacakan pada server dalam file konfigurasi aplikasi (baik App.config atau Web.config tergantung pada jenis proyek.) Anda menentukan kategori peristiwa mana yang ingin Anda catat. Dalam file konfigurasi, Anda juga menentukan apakah akan mencatat peristiwa ke file teks, log peristiwa Windows, atau log kustom menggunakan implementasi TraceListener.

Kategori peristiwa server mencakup jenis pesan berikut:

Sumber Pesan
SignalR.SqlMessageBus Penyiapan penyedia skala Bus Pesan SQL, operasi database, kesalahan, dan peristiwa waktu habis
SignalR.ServiceBusMessageBus Pembuatan topik penyedia skala bus layanan dan peristiwa langganan, kesalahan, dan olahpesan
SignalR.RedisMessageBus Koneksi penyedia skala redis, pemutusan sambungan, dan peristiwa kesalahan
SignalR.ScaleoutMessageBus Peristiwa olahpesan scaleout
SignalR.Transports.WebSocketTransport Koneksi transportasi WebSocket, pemutusan sambungan, olahpesan, dan peristiwa kesalahan
SignalR.Transports.ServerSentEventsTransport Koneksi transportasi ServerSentEvents, pemutusan sambungan, olahpesan, dan peristiwa kesalahan
SignalR.Transports.ForeverFrameTransport Koneksi transportasi ForeverFrame, pemutusan sambungan, olahpesan, dan peristiwa kesalahan
SignalR.Transports.LongPollingTransport Koneksi transportasi LongPolling, pemutusan sambungan, olahpesan, dan peristiwa kesalahan
SignalR.Transports.TransportHeartBeat Koneksi transportasi, pemutusan sambungan, dan peristiwa keepalive
SignalR.ReflectedHubDescriptorProvider Peristiwa penemuan hub

Mencatat peristiwa server ke file teks

Kode berikut menunjukkan cara mengaktifkan pelacakan untuk setiap kategori peristiwa. Sampel ini mengonfigurasi aplikasi untuk mencatat peristiwa ke file teks.

Kode server XML untuk mengaktifkan pelacakan

<system.diagnostics>
    <sources> 
      <source name="SignalR.SqlMessageBus">
        <listeners>
          <add name="SignalR-Bus" />
        </listeners>
      </source>
      <source name="SignalR.ServiceBusMessageBus">
        <listeners>
          <add name="SignalR-Bus" />
        </listeners>
      </source>
      <source name="SignalR.RedisMessageBus">
        <listeners>
          <add name="SignalR-Bus" />
        </listeners>
      </source>
      <source name="SignalR.ScaleoutMessageBus">
        <listeners>
          <add name="SignalR-Bus" />
        </listeners>
      </source>
      <source name="SignalR.Transports.WebSocketTransport">
        <listeners>
          <add name="SignalR-Transports" />
        </listeners>
      </source>     
      <source name="SignalR.Transports.ServerSentEventsTransport">
        <listeners>
          <add name="SignalR-Transports" />
        </listeners>
      </source>
      <source name="SignalR.Transports.ForeverFrameTransport">
        <listeners>
          <add name="SignalR-Transports" />
        </listeners>
      </source>
      <source name="SignalR.Transports.LongPollingTransport">
        <listeners>
          <add name="SignalR-Transports" />
        </listeners>
      </source>
      <source name="SignalR.Transports.TransportHeartBeat">
        <listeners>
          <add name="SignalR-Transports" />
        </listeners>
      </source>
      <source name="SignalR.ReflectedHubDescriptorProvider">
        <listeners>
          <add name="SignalR-Init" />
        </listeners>
      </source>
    </sources>
    <!-- Sets the trace verbosity level -->
    <switches>
      <add name="SignalRSwitch" value="Verbose" />
    </switches>
    <!-- Specifies the trace writer for output -->
    <sharedListeners>
      <!-- Listener for transport events -->
      <add name="SignalR-Transports" type="System.Diagnostics.TextWriterTraceListener" initializeData="transports.log.txt" />
      <!-- Listener for scaleout provider events -->
      <add name="SignalR-Bus" type="System.Diagnostics.TextWriterTraceListener" initializeData="bus.log.txt" />
      <!-- Listener for hub discovery events -->
      <add name="SignalR-Init" type="System.Diagnostics.TextWriterTraceListener" initializeData="init.log.txt" />
    </sharedListeners>
    <trace autoflush="true" />
  </system.diagnostics>

Dalam kode di atas, SignalRSwitch entri menentukan TraceLevel yang digunakan untuk peristiwa yang dikirim ke log yang ditentukan. Dalam hal ini, ini diatur ke Verbose yang berarti semua pesan penelusuran kesalahan dan pelacakan dicatat.

Output berikut menunjukkan entri dari transports.log.txt file untuk aplikasi menggunakan file konfigurasi di atas. Ini menunjukkan koneksi baru, koneksi yang dihapus, dan peristiwa heartbeat transportasi.

SignalR.Transports.TransportHeartBeat Information: 0 : Connection 9aa62c9b-09b3-416c-b367-06520e24f780 is New.
SignalR.Transports.TransportHeartBeat Verbose: 0 : KeepAlive(9aa62c9b-09b3-416c-b367-06520e24f780)
SignalR.Transports.TransportHeartBeat Verbose: 0 : KeepAlive(9aa62c9b-09b3-416c-b367-06520e24f780)
SignalR.Transports.TransportHeartBeat Verbose: 0 : KeepAlive(9aa62c9b-09b3-416c-b367-06520e24f780)
SignalR.Transports.WebSocketTransport Information: 0 : CloseSocket(9aa62c9b-09b3-416c-b367-06520e24f780)
SignalR.Transports.WebSocketTransport Information: 0 : Abort(9aa62c9b-09b3-416c-b367-06520e24f780)
SignalR.Transports.TransportHeartBeat Information: 0 : Removing connection 9aa62c9b-09b3-416c-b367-06520e24f780
SignalR.Transports.WebSocketTransport Information: 0 : End(9aa62c9b-09b3-416c-b367-06520e24f780)
SignalR.Transports.WebSocketTransport Verbose: 0 : DrainWrites(9aa62c9b-09b3-416c-b367-06520e24f780)
SignalR.Transports.WebSocketTransport Information: 0 : CompleteRequest (9aa62c9b-09b3-416c-b367-06520e24f780)

Mencatat peristiwa server ke log peristiwa

Untuk mencatat peristiwa ke log peristiwa daripada file teks, ubah nilai untuk entri dalam simpul sharedListeners . Kode berikut menunjukkan cara mencatat peristiwa server ke log peristiwa:

Kode server XML untuk peristiwa pengelogan ke log peristiwa

<sharedListeners>
  <!-- Listener for transport events -->
  <add name="SignalR-Transports" type="System.Diagnostics.EventLogTraceListener" initializeData="SignalRTransportLog" />
  <!-- Listener for scaleout provider events -->
  <add name="SignalR-Bus" type="System.Diagnostics.EventLogTraceListener" initializeData="SignalRScaleoutLog" />
  <!-- Listener for hub discovery events -->
  <add name="SignalR-Init" type="System.Diagnostics.EventLogTraceListener" initializeData="SignalRInitLog" />
</sharedListeners>

Peristiwa dicatat di log Aplikasi, dan tersedia melalui Penampil Peristiwa, seperti yang ditunjukkan di bawah ini:

Pemantau Peristiwa memperlihatkan log SignalR

Catatan

Saat menggunakan log peristiwa, atur TraceLevel ke Kesalahan untuk menjaga jumlah pesan tetap dapat dikelola.

Mengaktifkan pelacakan di klien .NET (aplikasi Windows Desktop)

Klien .NET dapat mencatat peristiwa ke konsol, file teks, atau ke log kustom menggunakan implementasi TextWriter.

Untuk mengaktifkan pengelogan di klien .NET, atur properti koneksi TraceLevel ke nilai TraceLevels , dan TraceWriter properti ke instans TextWriter yang valid.

Mencatat peristiwa klien Desktop ke konsol

Kode C# berikut menunjukkan cara mencatat peristiwa di klien .NET ke konsol:

var hubConnection = new HubConnection("http://www.contoso.com/");
hubConnection.TraceLevel = TraceLevels.All;
hubConnection.TraceWriter = Console.Out;
IHubProxy stockTickerHubProxy = hubConnection.CreateHubProxy("StockTickerHub");
stockTickerHubProxy.On<Stock>("UpdateStockPrice", stock => Console.WriteLine("Stock update for {0} new price {1}", stock.Symbol, stock.Price));
await hubConnection.Start();

Mencatat peristiwa klien Desktop ke file teks

Kode C# berikut menunjukkan cara mencatat peristiwa di klien .NET ke file teks:

var hubConnection = new HubConnection("http://www.contoso.com/");
var writer = new StreamWriter("ClientLog.txt");
writer.AutoFlush = true;
hubConnection.TraceLevel = TraceLevels.All;
hubConnection.TraceWriter = writer;
IHubProxy stockTickerHubProxy = hubConnection.CreateHubProxy("StockTickerHub");
stockTickerHubProxy.On<Stock>("UpdateStockPrice", stock => Console.WriteLine("Stock update for {0} new price {1}", stock.Symbol, stock.Price));
await hubConnection.Start();

Output berikut menunjukkan entri dari ClientLog.txt file untuk aplikasi menggunakan file konfigurasi di atas. Ini menunjukkan klien yang terhubung ke server, dan hub memanggil metode klien yang disebut addMessage:

19:41:39.9103763 - null - ChangeState(Disconnected, Connecting)
19:41:40.3750726 - dd61fd48-d796-4518-b36b-ec1dcb970d72 - WS Connecting to: ws://localhost:8080/signalr/signalr/connect?transport=webSockets&clientProtocol=1.4&connectionToken=AQAAANCMnd8BFdERjHoAwE%2FCl%2BsBAAAAh8Lp 
KH5%2FDkCQeR4ALAwR%2BAAAAAACAAAAAAADZgAAwAAAABAAAADHpCa7wm%2FbOhjluf%2Fm9GA9AAAAAASAAACgAAAAEA 
AAAEqRfJihLExRI6tZy7lWRwYoAAAApotSsJXW0OiwEgiUUi0pzhK6oKbz%2BkMeVbezuEDQLnJecM9otFe9PRQAAAAuHK
BlOnPmXt%2FhXV%2Felr1QvC156Q%3D%3D&connectionData=[{"Name":"MyHub"}]
19:41:40.4442923 - dd61fd48-d796-4518-b36b-ec1dcb970d72 - WS: OnMessage({"C":"d-5196BF5C-A,0|B,0|C,1|D,0","S":1,"M":[]})
19:41:40.4874324 - dd61fd48-d796-4518-b36b-ec1dcb970d72 - ChangeState(Connecting, Connected)
19:41:47.4511770 - dd61fd48-d796-4518-b36b-ec1dcb970d72 - WS: OnMessage({"C":"d-5196BF5C-A,1|B,0|C,1|D,0","M":[{"H":"MyHub","M":"addMessage","A":["User One","Hello!"]}]})
19:41:47.4576968 - dd61fd48-d796-4518-b36b-ec1dcb970d72 - WS: OnMessage({"I":"0"})
19:41:50.3959119 - dd61fd48-d796-4518-b36b-ec1dcb970d72 - WS: OnMessage({})
19:41:50.8928084 - dd61fd48-d796-4518-b36b-ec1dcb970d72 - WS: OnMessage({"C":"d-5196BF5C-A,2|B,0|C,1|D,0","M":[{"H":"MyHub","M":"addMessage","A":["User Two","Hello!"]}]})

Mengaktifkan pelacakan di klien Windows Phone 8

Aplikasi SignalR untuk aplikasi Windows Phone menggunakan klien .NET yang sama dengan aplikasi desktop, tetapi Console.Out dan menulis ke file dengan StreamWriter tidak tersedia. Sebagai gantinya, Anda perlu membuat implementasi kustom TextWriter untuk pelacakan.

Mencatat peristiwa klien Windows Phone ke UI

Basis kode SignalR menyertakan sampel Windows Phone yang menulis output jejak ke TextBlock menggunakan implementasi TextWriter kustom yang disebut TextBlockWriter. Kelas ini dapat ditemukan di proyek samples/Microsoft.AspNet.SignalR.Client.WP8.Samples . Saat membuat instans TextBlockWriter, berikan SynchronizationContext saat ini, dan StackPanel di mana ia akan membuat TextBlock untuk digunakan untuk output pelacakan:

Connection = new HubConnection(ServerURI);
var writer = new TextBlockWriter(SynchronizationContext.Current, StackPanelConsole);
Connection.TraceWriter = writer;
Connection.TraceLevel = TraceLevels.All;

Output pelacakan kemudian akan ditulis ke TextBlock baru yang dibuat di StackPanel yang Anda lewati:

Cuplikan layar yang memperlihatkan sampel Windows Phone dengan output di tampilan.

Mencatat peristiwa klien Windows Phone ke konsol debug

Untuk mengirim output ke konsol debug daripada UI, buat implementasi TextWriter yang menulis ke jendela debug, dan tetapkan ke properti TraceWriter koneksi Anda:

Connection = new HubConnection(ServerURI);
var writer = new DebugTextWriter();
Connection.TraceWriter = writer;
Connection.TraceLevel = TraceLevels.All;

...

private class DebugTextWriter : TextWriter
{
    private StringBuilder buffer;

    public DebugTextWriter()
    {
        buffer = new StringBuilder();
    }

    public override void Write(char value)
    {
        switch (value)
        {
            case '\n':
                return;
            case '\r':
                Debug.WriteLine(buffer.ToString());
                buffer.Clear();
                return;
            default:
                buffer.Append(value);
                break;
        }
    }
            
    public override void Write(string value)
    {
        Debug.WriteLine(value);
                
    }
    #region implemented abstract members of TextWriter
    public override Encoding Encoding
    {
        get { throw new NotImplementedException(); }
    }
    #endregion
}

Informasi pelacakan kemudian akan ditulis ke jendela debug di Visual Studio:

Cuplikan layar yang memperlihatkan kotak dialog Output. Debug ada di bidang Tampilkan output dari.

Mengaktifkan pelacakan di klien JavaScript

Untuk mengaktifkan pengelogan sisi klien pada koneksi, atur logging properti pada objek koneksi sebelum Anda memanggil start metode untuk membuat koneksi.

Kode JavaScript klien untuk mengaktifkan pelacakan ke konsol browser (dengan proksi yang dihasilkan)

$.connection.hub.logging = true;
$.connection.hub.start();

Kode JavaScript klien untuk mengaktifkan pelacakan ke konsol browser (tanpa proksi yang dihasilkan)

var connection = $.hubConnection();
connection.logging = true;
connection.start();

Saat pelacakan diaktifkan, klien JavaScript mencatat peristiwa ke konsol browser. Untuk mengakses konsol browser, lihat Memantau Transportasi.

Cuplikan layar berikut menunjukkan klien SignalR JavaScript dengan pelacakan diaktifkan. Ini menunjukkan peristiwa pemanggilan koneksi dan hub di konsol browser:

Peristiwa pelacakan SignalR di konsol browser