Aracılığıyla paylaş


EventSource'u Kullanmaya Başlama

Bu makale şunlar için geçerlidir: ✔️ .NET Core 3.1 ve sonraki sürümleri .✔️ NET Framework 4.5 ve sonraki sürümleri

Bu kılavuz, System.Diagnostics.Tracing.EventSourceile yeni bir olayı loglamayı, iz dosyasında olayları toplamayı, izi görüntülemeyi ve temel EventSource kavramlarını anlamayı gösterir.

Not

EventSource ile tümleşen birçok teknolojide 'Logging' ve 'Logs' yerine 'İzleme' ve 'İzler' terimleri kullanılır. Burada anlam aynıdır.

Olayı günlüğe kaydet

EventSource'un amacı, .NET geliştiricilerinin bir olayı günlüğe kaydetmek için aşağıdaki gibi kodlar yazmasına izin vermektir:

DemoEventSource.Log.AppStarted("Hello World!", 12);

Bu kod satırında günlüğe kaydedilecek olayı temsil eden bir yöntem (DemoEventSource.Log), günlüğe kaydedilecek olayı temsil eden bir yöntem (AppStarted) ve isteğe bağlı olarak bazı kesin olarak belirlenmiş olay parametreleri (HelloWorld! ve 12) vardır. Ayrıntı düzeyi, olay kimlikleri, ileti şablonları veya çağrı sitesinde olması gerekmeyen başka bir şey yoktur. Olaylarla ilgili diğer tüm bilgiler, System.Diagnostics.Tracing.EventSourcetüretilmiş yeni bir sınıf tanımlanarak yazılır.

İşte eksiksiz bir minimal örnek:

using System.Diagnostics.Tracing;

namespace EventSourceDemo
{
    public static class Program
    {
        public static void Main(string[] args)
        {
            DemoEventSource.Log.AppStarted("Hello World!", 12);
        }
    }

    [EventSource(Name = "Demo")]
    class DemoEventSource : EventSource
    {
        public static DemoEventSource Log { get; } = new DemoEventSource();

        [Event(1)]
        public void AppStarted(string message, int favoriteNumber) => WriteEvent(1, message, favoriteNumber);
    }
}

DemoEventSource sınıfı, günlüğe kaydetmek istediğiniz her olay türü için bir yöntem bildirir. Bu durumda, AppStarted() yöntemi tarafından 'AppStarted' adlı tek bir olay tanımlanır. Kod, her seferinde AppStarted yöntemini çağırdığında, olay etkinse izleme sisteminde bir başka AppStarted olayı kaydedilir. Her olayla yakalanabilecek verilerden bazıları şunlardır:

  • Olay adı - Günlüğe kaydedilen olay türünü tanımlayan ad. Olay adı, bu örnekte 'AppStarted' yöntemi adıyla aynı olacaktır.
  • Olay Kimliği - Günlüğe kaydedilen olay türünü tanımlayan sayısal kimlik. Bu, isme benzer bir role sahiptir ve hızlı ve otomatik günlük işlemeye yardımcı olabilir. AppStarted olayı, EventAttributeiçinde belirtilen ID 1'e sahiptir.
  • Kaynak adı - Olayı içeren EventSource'un adı. Bu, olaylar için ad alanı olarak kullanılır. Olay adlarının ve kimliklerinin yalnızca kaynakları kapsamında benzersiz olması gerekir. Burada kaynak, sınıf tanımındaki EventSourceAttribute'da belirtilen "Demo" olarak adlandırılır. Kaynak adı genellikle sağlayıcı adı olarak da adlandırılır.
  • Bağımsız değişkenler - Tüm yöntem bağımsız değişken değerleri serileştirilir.
  • Diğer bilgiler - Olaylar zaman damgaları, iş parçacığı kimlikleri, işlemci kimlikleri, Etkinlik Kimlikleri, yığın izlemeleri ve ileti şablonları, ayrıntı düzeyleri ve anahtar sözcükler gibi olay meta verilerini de içerebilir.

Olay oluşturma hakkında daha fazla bilgi ve en iyi yöntemler için bkz. olay oluşturma için kod hazırlama.

İzleme dosyasını topla ve görüntüle

Kodda hangi olayların etkinleştirilmesi gerektiğini, günlüğe kaydedilen verilerin nereye gönderilmesi gerektiğini veya verilerin hangi biçimde depolanması gerektiğini açıklayan gerekli bir yapılandırma yoktur. Uygulamayı şimdi çalıştırırsanız, varsayılan olarak hiçbir izleme dosyası üretmez. EventSource, abonelerin etkinleştirilmesi gereken olayları belirtmesini ve abone olunan olaylar için tüm serileştirmeyi denetlemesini gerektiren Publish-subscribe deseninikullanır. EventSource, Windows için olay izleme (ETW) ve EventPipe (yalnızca.NET Core) için olay izlemeden aboneliğe yönelik tümleştirmelere sahiptir. Özel aboneler System.Diagnostics.Tracing.EventListener API'sini kullanarak da oluşturulabilir.

Bu tanıtımda .NET Core uygulamaları için bir EventPipe örneği gösterilmektedir. Daha fazla seçenek hakkında bilgi edinmek için bkz. olay izlemelerini toplama ve görüntüleme. EventPipe, .NET geliştiricilerine izleme toplama araçları ve taşınabilir bir kompakt izleme biçimi (*.nettrace dosyaları) sağlamak için .NET Core çalışma zamanında yerleşik olarak bulunan açık ve platformlar arası bir izleme teknolojisidir. dotnet-trace, EventPipe izlemelerini toplayan bir komut satırı aracıdır.

  1. dotnet-traceindirip yükleyin.
  2. Yukarıdaki konsol uygulamasını oluşturun. Bu demo, uygulamanın EventSourceDemo.exe olarak adlandırıldığını ve geçerli dizinde bulunduğunu varsayar. Komut satırında şunu çalıştırın:
>dotnet-trace collect --providers Demo -- EventSourceDemo.exe

Bu, şuna benzer bir çıkış göstermelidir:

Provider Name                           Keywords            Level               Enabled By
Demo                                    0xFFFFFFFFFFFFFFFF  Verbose(5)          --providers

Launching: EventSourceDemo.exe
Process        : E:\temp\EventSourceDemo\bin\Debug\net6.0\EventSourceDemo.exe
Output File    : E:\temp\EventSourceDemo\bin\Debug\net6.0\EventSourceDemo.exe_20220303_001619.nettrace

[00:00:00:00]   Recording trace 0.00     (B)
Press <Enter> or <Ctrl+C> to exit...

Trace completed.

Bu komut, 'Demo' EventSource'taki tüm olaylar etkinken EventSourceDemo.exe çalıştırıp EventSourceDemo.exe_20220303_001619.nettraceizleme dosyasının çıktısını verdi. Visual Studio'da dosyayı açmak, günlüğe kaydedilen olayları gösterir.

Visual Studio nettrace dosyası

Liste görünümünde ilk olayın Demo/AppStarted olayı olduğunu görebilirsiniz. Metin sütununda kaydedilmiş bağımsız değişkenler bulunur, zaman damgası sütunu, günlüğe kaydedilmeye başlandıktan 27 ms sonra gerçekleşen olayı gösterir ve sağ tarafta çağrı yığınını görebilirsiniz. tr-TR: Diğer olaylar dotnet-trace tarafından toplanan her izlemede otomatik olarak etkinleştirilir, ancak dikkatleri dağıtıyorsa kullanıcı arabiriminde görünmez hale getirilebilir ve filtrelenebilir. Bu ek olaylar, visual Studio'nun olay yığını izlemelerini yeniden oluşturmasına olanak tanıyan işlem ve jitted kod hakkında bazı bilgileri yakalar.

EventSource hakkında daha fazla bilgi edinme