.NET'te oturum açma

.NET, çeşitli yerleşik ve üçüncü taraf günlük sağlayıcılarıyla çalışan bir günlük API'sini destekler. Bu makalede yerleşik sağlayıcılarla günlüğe kaydetme API'sini nasıl kullanabileceğiniz açıklanmıştır. Bu makalede gösterilen kod örneklerinin çoğu, Genel Ana Bilgisayarı kullanan herhangi bir .NET uygulaması için geçerlidir. Genel Ana Bilgisayar kullanmayan uygulamalar için bkz. Konak dışı konsol uygulaması.

İpucu

Günlüğe kaydetme örneği kaynak kodunun hepsi, örnekler tarayıcısında indirilebilir. Daha fazla bilgi için bkz. Kod örneklerine göz atma: .NET'te günlüğe kaydetme.

Önemli

.NET 6'dan başlayarak günlük hizmetleri artık türü ILogger kaydetmez. Günlük kaydı kullanırken, genel tür alternatifi belirtin ILogger<TCategoryName> veya bağımlılık ekleme ILogger (DI) ile kaydettirin.

Günlük oluşturma

Günlükleri oluşturmak için ILogger<TCategoryName> DI'den bir nesnesi kullanın.

Aşağıdaki örnek:

  • türünde tam adı ILogger<Worker> olan bir günlük kategorisi kullanan bir günlük kaydı Worker oluşturur. Günlük kategorisi, her günlükle ilişkilendirilmiş bir dizedir.
  • Düzeyinde LogInformation günlüğe günlüğe Information çağrılar. Günlük düzeyi, günlüğe kaydedilen olayın önem derecelerini gösterir.
public class Worker : BackgroundService
{
    private readonly ILogger<Worker> _logger;

    public Worker(ILogger<Worker> logger) =>
        _logger = logger;

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        while (!stoppingToken.IsCancellationRequested)
        {
            _logger.LogInformation("Worker running at: {time}", DateTimeOffset.UtcNow);
            await Task.Delay(1000, stoppingToken);
        }
    }
}

Düzeyler ve kategoriler bu makalenin devamlarında daha ayrıntılı olarak açıklanmıştır.

Günlüğü yapılandırma

Günlük yapılandırması genellikle Logging appsettings bölümü tarafından sağlanır. {Environment} .json dosyaları. Aşağıdaki uygulama ayarları. Development.json dosyası .NET Çalışanı hizmet şablonları tarafından oluşturulur:

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  }
}

Yukarıdaki JSON kodunda:

  • "Default", "Microsoft" ve "Microsoft.Hosting.Lifetime" kategorileri belirtilir.
  • Kategori, "Microsoft" ile başlarken tüm kategoriler için "Microsoft" geçerlidir.
  • Kategori, "Microsoft" günlük düzeyinde ve daha üst düzeyde günlüğe Warning kaydedilir.
  • Kategori kategoriye göre daha özeldir, bu nedenle kategori "Microsoft.Hosting.Lifetime" günlük düzeyinde "Microsoft" "Microsoft.Hosting.Lifetime" "Bilgi" ve üst düzeyde günlüğe kaydedilir.
  • Belirli bir günlük sağlayıcısı belirtilmez, bu nedenle eventlog dışındaki tüm etkin LogLevel günlük Windows geçerlidir.

özelliği Logging ve günlük sağlayıcısı LogLevel özelliklerine sahip olabilir. , LogLevel seçilen kategoriler için günlüğe kaydedilir en düşük düzeyi belirtir. Önceki JSON'da Information Warning ve günlük düzeyleri belirtilir. LogLevel günlüğün önem derecesine işaret ve 0 ile 6 arasında bir aralık gösterir:

Trace = 0, Debug = 1, Information = 2, Warning = 3, Error = 4, Critical = 5 ve = None 6.

bir LogLevel belirtilirse, belirtilen düzeyde ve daha yüksek düzeyde iletiler için günlüğe kaydetme etkinleştirilir. Önceki JSON'da, Default kategorisi ve daha yüksek bir değer için günlüğe Information kaydedilir. Örneğin, Information , Warning Error , ve iletileri Critical günlüğe kaydedilir. LogLevelBelirtilmezse, günlüğe kaydetme varsayılan olarak düzeye Information göredir. Daha fazla bilgi için bkz. Günlük düzeyleri.

Sağlayıcı özelliği bir özellik LogLevel belirtebilirsiniz. LogLevel bir sağlayıcı altında bu sağlayıcı için günlüğe kaydedilir düzeyleri belirtir ve sağlayıcı olmayan günlük ayarlarını geçersiz kılar. Aşağıdaki appsettings.json dosyasını göz önünde bulundurabilirsiniz:

{
    "Logging": {
        "LogLevel": {
            "Default": "Error",
            "Microsoft": "Warning"
        },
        "Debug": {
            "LogLevel": {
                "Default": "Information",
                "Microsoft.Hosting": "Trace"
            }
        },
        "EventSource": {
            "LogLevel": {
                "Default": "Warning"
            }
        }
    }
}

Ayarlar Logging.{ProviderName}.LogLevel ayarlarına Logging.LogLevel tıklayın. Yukarıdaki JSON'da Debug sağlayıcının varsayılan günlük düzeyi olarak Information ayarlanır:

Logging:Debug:LogLevel:Default:Information

Yukarıdaki ayar dışında her Information kategori için günlük düzeyini Logging:Debug: Microsoft.Hosting belirtir. Belirli bir kategori listelenmişse, belirli bir kategori varsayılan kategoriyi geçersiz kılar. Yukarıdaki JSON'da, kategorileri Logging:Debug:LogLevel ve "Microsoft.Hosting" "Default"``Logging:LogLevel

En düşük günlük düzeyi, aşağıdakilerin herhangi biri için belirtilebilir:

  • Belirli sağlayıcılar: Örneğin, Logging:EventSource:LogLevel:Default:Information
  • Belirli kategoriler: Örneğin, Logging:LogLevel:Microsoft:Warning
  • Tüm sağlayıcılar ve tüm kategoriler: Logging:LogLevel:Default:Warning

En düşük düzeyin altındaki günlükler değildir:

  • Sağlayıcıya geçirildi.
  • Günlüğe kaydedilir veya görüntülenir.

Tüm günlükleri gizlemek için LogLevel.None belirtin. LogLevel.None değeri 6'dan LogLevel.Critical (5) yüksektir.

Sağlayıcı günlük kapsamlarını destekliyorsa, IncludeScopes etkinleştirilip etkinleştirilme olduklarını gösterir. Daha fazla bilgi için bkz. günlük kapsamları

Aşağıdaki appsettings.json dosyası tüm yerleşik sağlayıcıların ayarlarını içerir:

{
    "Logging": {
        "LogLevel": {
            "Default": "Error",
            "Microsoft": "Warning",
            "Microsoft.Hosting.Lifetime": "Warning"
        },
        "Debug": {
            "LogLevel": {
                "Default": "Information"
            }
        },
        "Console": {
            "IncludeScopes": true,
            "LogLevel": {
                "Microsoft.Extensions.Hosting": "Warning",
                "Default": "Information"
            }
        },
        "EventSource": {
            "LogLevel": {
                "Microsoft": "Information"
            }
        },
        "EventLog": {
            "LogLevel": {
                "Microsoft": "Information"
            }
        },
        "AzureAppServicesFile": {
            "IncludeScopes": true,
            "LogLevel": {
                "Default": "Warning"
            }
        },
        "AzureAppServicesBlob": {
            "IncludeScopes": true,
            "LogLevel": {
                "Microsoft": "Information"
            }
        },
        "ApplicationInsights": {
            "LogLevel": {
                "Default": "Information"
            }
        }
    }
}

Yukarıdaki örnekte:

  • Kategoriler ve düzeyler önerilen değerler değildir. Örnek, tüm varsayılan sağlayıcıları göstermek için sağlanır.
  • Ayarlar Logging.{ProviderName}.LogLevel ayarlarına Logging.LogLevel tıklayın. Örneğin, 'daki Debug.LogLevel.Default düzeyi' içinde düzeyini geçersiz LogLevel.Default kılar.
  • Her sağlayıcının diğer adı kullanılır. Her sağlayıcı, yapılandırmada tam tür adı yerine kullanılan bir diğer ad tanımlar. Yerleşik sağlayıcıların diğer adları:
    • Konsol
    • Hata Ayıklama
    • EventSource
    • Eventlog
    • AzureAppServicesFile
    • AzureAppServicesBlob
    • ApplicationInsights

Komut satırına, ortam değişkenlerine ve diğer yapılandırmaya göre günlük düzeyini ayarlama

Günlük düzeyi, yapılandırma sağlayıcılarından herhangi biri tarafından ayarlanır. Örneğin, değeriyle adlı kalıcı bir ortam Logging:LogLevel:Microsoft değişkeni Information oluşturabilirsiniz.

Günlük düzeyi değerine göre kalıcı ortam değişkeni oluşturun ve attayın.

:: Assigns the env var to the value
setx "Logging__LogLevel__Microsoft" "Information" /M

Komut İstemi'nin yeni bir örneğinde, ortam değişkenlerini okuyun.

:: Prints the env var value
echo %Logging__LogLevel__Microsoft%

Önceki ortam ayarı ortamda kalıcıdır. .NET Çalışanı hizmet şablonlarıyla oluşturulan bir uygulama kullanılırken ayarları test etmek için ortam değişkeni atandıktan sonra proje dizininde dotnet run komutunu kullanın.

dotnet run

İpucu

Ortam değişkenini ayardikten sonra, yeni eklenen ortam değişkenlerinin kullanılabilir olduğundan emin olmak için tümleşik geliştirme ortamınızı (IDE) yeniden başlatın.

Yeni Azure App Servicesayfasında Yeni uygulama ayarı'Ayarlar > seçin. Azure App Service ayarları şu şekildedir:

  • Istirahatta şifrelenir ve şifrelenmiş bir kanal üzerinden iletilir.
  • Ortam değişkenleri olarak ortaya çıkar.

Ortam değişkenlerini kullanarak .NET yapılandırma değerlerini ayarlama hakkında daha fazla bilgi için bkz. ortam değişkenleri.

Filtreleme kurallarının uygulanması

Bir nesne ILogger<TCategoryName> oluşturulduğunda nesne, ILoggerFactory günlükleyiciye uygulamak için sağlayıcı başına tek bir kural seçer. Bir örnek tarafından yazılan ILogger tüm iletiler, seçilen kurallara göre filtrelenmiş olur. Her sağlayıcı ve kategori çifti için en özel kural, kullanılabilir kurallardan seçilir.

Aşağıdaki algoritma, bir kategori için oluşturulduğunda ILogger her sağlayıcı için kullanılır:

  • Sağlayıcıyla veya diğer adıyla eşan tüm kuralları seçin. Eşleşme bulunamıyorsa, boş sağlayıcıya sahip tüm kuralları seçin.
  • Önceki adımın sonucunda en uzun eşleşen kategori ön eke sahip kuralları seçin. Eşleşme bulunamıyorsa, bir kategori belirtmeyen tüm kuralları seçin.
  • Birden çok kural seçilirse, son kurala sahip olun.
  • Hiçbir kural seçilmezse, en LoggingBuilderExtensions.SetMinimumLevel(ILoggingBuilder, LogLevel) düşük günlük kaydı düzeyini belirtmek için kullanın.

Günlük kategorisi

Bir ILogger nesne oluşturulduğunda bir kategori belirtilir. Bu kategori, bu örneği tarafından oluşturulan her günlük iletisine dahil ILogger edilir. Kategori dizesi rastgeledir, ancak kural sınıf adını kullanmaktır. Örneğin, aşağıdaki nesne gibi tanımlanmış bir hizmete sahip bir uygulamada kategori şöyle "Example.DefaultService" olabilir:

namespace Example
{
    public class DefaultService : IService
    {
        private readonly ILogger<DefaultService> _logger;

        public DefaultService(ILogger<DefaultService> logger) =>
            _logger = logger;

        // ...
    }
}

Kategoriyi açıkça belirtmek için çağrısında bulundu: LoggerFactory.CreateLogger

namespace Example
{
    public class DefaultService : IService
    {
        private readonly ILogger _logger;

        public DefaultService(ILoggerFactory loggerFactory) =>
            _logger = loggerFactory.CreateLogger("CustomCategory");

        // ...
    }
}

Sabit bir adla çağrısı birden çok sınıfta/türde kullanılırken yararlı olabilir, böylece CreateLogger olaylar kategoriye göre organize olabilir.

ILogger<T> , tam CreateLogger tür adıyla çağrısına T eşdeğerdir.

Günlük düzeyi

Aşağıdaki tabloda LogLevel değerler, kolaylık uzantısı Log{LogLevel} yöntemi ve önerilen kullanım listele devam eder:

LogLevel Değer Yöntem Açıklama
İzleme 0 LogTrace En ayrıntılı iletileri içerir. Bu iletiler hassas uygulama verileri içerebilir. Bu iletiler varsayılan olarak devre dışıdır ve üretimde etkinleştirilmemiş olmalıdır.
Hata Ayıklama 1 LogDebug Hata ayıklama ve geliştirme için. Yüksek hacimden dolayı üretimde dikkatli kullanın.
Bilgi 2 LogInformation Uygulamanın genel akışını izler. Uzun vadeli değere sahip olabilir.
Uyarı 3 LogWarning Anormal veya beklenmeyen olaylar için. Genellikle uygulamanın başarısız olmasıyla ilgili hatalar veya koşullar içerir.
Hata 4 LogError Düzeltilene hatalar ve özel durumlar için. Bu iletiler, uygulama genelinde hata değil geçerli işlemde veya istekte bir hata olduğunu gösteriyor.
Kritik 5 LogCritical Hemen dikkat gerektiren hatalar için. Örnekler: veri kaybı senaryoları, disk alanı dışında.
Hiçbiri 6 Hiçbir ileti yazılmay gerektiğini belirtir.

Önceki tabloda, en LogLevel düşükten en yüksek önem derecesine kadar listelenir.

Log yönteminin ilk parametresi olan LogLevel , günlüğün önem derecelerini gösterir. Çoğu Log(LogLevel, ...) geliştirici, öğesini aramak yerine Log{LogLevel} uzantı yöntemlerini çağırıyor. Uzantı Log{LogLevel} yöntemleri Log yöntemini çağırarak LogLevel'i belirtir. Örneğin, aşağıdaki iki günlük çağrısı işlevsel olarak eşdeğerdir ve aynı günlüğü üretir:

public void LogDetails()
{
    var logMessage = "Details for log.";

    _logger.Log(LogLevel.Information, AppLogEvents.Details, logMessage);
    _logger.LogInformation(AppLogEvents.Details, logMessage);
}

AppLogEvents.Details olay kimliğidir ve örtülü olarak sabit bir değerle temsil Int32 edilen değerdir. AppLogEvents, çeşitli adlandırılmış tanımlayıcı sabitlerini ortaya çıkaran ve Günlük olay kimliği bölümünde görüntülenen bir sınıftır.

Aşağıdaki kod oluşturur Information ve Warning günlüğe kaydeder:

public async Task<T> GetAsync<T>(string id)
{
    _logger.LogInformation(AppLogEvents.Read, "Reading value for {Id}", id);

    var result = await _repository.GetAsync(id);
    if (result is null)
    {
        _logger.LogWarning(AppLogEvents.ReadNotFound, "GetAsync({Id}) not found", id);
    }

    return result;
}

Yukarıdaki kodda ilk Log{LogLevel} parametresi, AppLogEvents.Read Günlük olay kimliğidir. İkinci parametre, kalan yöntem parametreleri tarafından sağlanan bağımsız değişken değerleri için yer tutucuları olan bir ileti şablonudur. Yöntem parametreleri bu makalenin ilerleyen kısımlarında ileti şablonu bölümünde açıklanmıştır.

Uygun günlük düzeyini yapılandırma ve belirli bir depolama ortamına ne kadar günlük çıkışı yazıldığından Log{LogLevel} emin olmak için doğru yöntemleri çağırma. Örnek:

  • Üretimde:
    • veya Trace düzeylerinde Information günlüğe kaydetme, yüksek hacimli ayrıntılı günlük iletileri üretir. Maliyetleri denetleme ve veri depolama sınırlarını aşmama, iletileri yüksek hacimli, düşük maliyetli bir veri deposuna günlüğe ve Trace Information düzeye gönderme. ve'i Trace belirli Information kategorilerle sınırlamayı göz önünde bulundurabilirsiniz.
    • Düzeylerde Warning günlüğe kaydetme birkaç günlük mesajı Critical üretecek.
      • Maliyetler ve depolama sınırları genellikle sorun değildir.
      • Az sayıda günlük, veri deposu seçimlerinde daha fazla esneklik sağlar.
  • Geliştirme aşamasında:
    • Warning olarak ayarlayın.
    • Sorun Trace gidermeye Information yönelik iletiler ekleyin. Çıkışı sınırlamak için veya Trace yalnızca araştırma altındaki kategoriler için Information ayarlayın.

Aşağıdaki JSON Logging:Console:LogLevel:Microsoft:Information kümeleri:

{
    "Logging": {
        "LogLevel": {
            "Microsoft": "Warning"
        },
        "Console": {
            "LogLevel": {
                "Microsoft": "Information"
            }
        }
    }
}

Günlük olay kimliği

Her günlük bir olay tanımlayıcısı belirtebilirsiniz., salt okunur ve isteğe EventId bağlı özellikleri olan bir Id Name yapıdır. Örnek kaynak kodu, olay AppLogEvents kimliklerini tanımlamak için sınıfını kullanır:

internal static class AppLogEvents
{
    internal const int Create = 1000;
    internal const int Read = 1001;
    internal const int Update = 1002;
    internal const int Delete = 1003;

    internal const int Details = 3000;
    internal const int Error = 3001;

    internal const int ReadNotFound = 4000;
    internal const int UpdateNotFound = 4001;

    // ...
}

Olay kimliği bir olay kümesiyle ilişkilendirmektedir. Örneğin, bir depodan değerleri okumakla ilgili tüm günlükler 1001 olabilir.

Günlük sağlayıcısı olay kimliğini bir kimlik alanında, günlüğe kaydetme iletisinde veya hiç günlüğe kaydetmeden günlüğe kaydetmeye devam eder. Hata ayıklama sağlayıcısı olay kimliklerini göstermez. Konsol sağlayıcısı, olay kimliklerini kategoriden sonra köşeli ayraç içinde gösterir:

info: Example.DefaultService.GetAsync[1001]
      Reading value for a1b2c3
warn: Example.DefaultService.GetAsync[4000]
      GetAsync(a1b2c3) not found

Bazı günlük sağlayıcıları olay kimliğini bir alanda depolar ve bu da kimliği filtrelemeye olanak sağlar.

Günlük iletisi şablonu

Her günlük API'si bir ileti şablonu kullanır. İleti şablonu, bağımsız değişkenlerin sağlanacak yer tutucularını içerebilir. Sayılar için değil yer tutucular için ad kullanın. Yer tutucuların adları değil sıraları, değerlerini sağlamak için kullanılan parametreleri belirler. Aşağıdaki kodda, parametre adları ileti şablonunda sıra dışındadır:

string p1 = "param1";
string p2 = "param2";
_logger.LogInformation("Parameter values: {p2}, {p1}", p1, p2);

Yukarıdaki kod, sırasıyla parametre değerleriyle bir günlük iletisi oluşturur:

Parameter values: param1, param2

Bu yaklaşım, günlük sağlayıcılarının semantik veya yapılandırılmış günlük kaydı uygulamasına olanak sağlar. Bağımsız değişkenler yalnızca biçimlendirilmiş ileti şablonuna değil günlük sistemine geçirildi. Bu, günlük sağlayıcılarının parametre değerlerini alan olarak depolamasını sağlar. Aşağıdaki günlükleyici yöntemini göz önünde önünden yapın:

_logger.LogInformation("Getting item {Id} at {RunTime}", id, DateTime.Now);

Örneğin, Azure Tablo Veritabanı'Depolama:

  • Her Azure Tablo varlığı ve ID RunTime özelliklerine sahip olabilir.
  • Özelliklere sahip tablolar, günlüğe kaydedilen verilerde sorguları basitleştirir. Örneğin, bir sorgu kısa mesajın zaman aralığını ayrıştırmak zorunda kalmadan belirli bir RunTime aralık içindeki tüm günlükleri bulabilir.

Günlük özel durumları

Günlükçer yöntemlerinin özel durum parametresi alan aşırı yüklemeleri vardır:

public void Test(string id)
{
    try
    {
        if (id == "none")
        {
            throw new Exception("Default Id detected.");
        }
    }
    catch (Exception ex)
    {
        _logger.LogWarning(
            AppLogEvents.Error, ex,
            "Failed to process iteration: {Id}", id);
    }
}

Özel durum günlüğü sağlayıcıya özgü bir günlük kaydıdır.

Varsayılan günlük düzeyi

Varsayılan günlük düzeyi ayarlanmazsa varsayılan günlük düzeyi değeri Information olur.

Örneğin, aşağıdaki çalışan hizmeti uygulamasını düşünün:

  • .NET Worker şablonlarıyla oluşturulur.
  • appSettings. JSON ve appSettings. Development. JSON silindi veya yeniden adlandırıldı.

Önceki kurulumla, gizlilik veya giriş sayfasına gidildiğinde Trace Debug Kategori adında birçok, ve Information ile ileti üretilir Microsoft .

Aşağıdaki kod, varsayılan günlük düzeyi yapılandırmada ayarlanmamışsa varsayılan günlük düzeyini ayarlar:

class Program
{
    static Task Main(string[] args) =>
        CreateHostBuilder(args).Build().RunAsync();

    static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureLogging(logging => logging.SetMinimumLevel(LogLevel.Warning));
}

Filter işlevi

Configuration veya Code tarafından kendisine atanmış kuralları olmayan tüm sağlayıcılar ve kategoriler için bir filtre işlevi çağrılır:

class Program
{
    static Task Main(string[] args) =>
        CreateHostBuilder(args).Build().RunAsync();

    static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureLogging(logging =>
                logging.AddFilter((provider, category, logLevel) =>
                {
                    return provider.Contains("ConsoleLoggerProvider")
                        && (category.Contains("Example") || category.Contains("Microsoft"))
                        && logLevel >= LogLevel.Information;
                }));
}

Önceki kod, kategori içerdiğinde Example veya Microsoft ve günlük düzeyi Information veya daha yüksek olduğunda konsol günlüklerini görüntüler.

Günlük kapsamları

Kapsam bir mantıksal işlemler kümesini gruplandırabilir. Bu gruplandırma, kümenin bir parçası olarak oluşturulan her günlüğe aynı verileri eklemek için kullanılabilir. Örneğin, bir işlemin işlenmesi kapsamında oluşturulan her günlük işlem KIMLIĞI içerebilir.

Kapsam:

Aşağıdaki sağlayıcılar kapsamları destekler:

Bir blok içinde günlükçü çağrılarını sarmalayarak kapsam kullanın using :

public async Task<T> GetAsync<T>(string id)
{
    T result;

    using (_logger.BeginScope("using block message"))
    {
        _logger.LogInformation(
            AppLogEvents.Read, "Reading value for {Id}", id);

        var result = await _repository.GetAsync(id);
        if (result is null)
        {
            _logger.LogWarning(
                AppLogEvents.ReadNotFound, "GetAsync({Id}) not found", id);
        }
    }

    return result;
}

Aşağıdaki JSON konsol sağlayıcısı için kapsamları etkinleştirdi:

{
    "Logging": {
        "Debug": {
            "LogLevel": {
                "Default": "Information"
            }
        },
        "Console": {
            "IncludeScopes": true,
            "LogLevel": {
                "Microsoft": "Warning",
                "Default": "Information"
            }
        },
        "LogLevel": {
            "Default": "Debug"
        }
    }
}

Aşağıdaki kod konsol sağlayıcısı için kapsamları etkinleştirilir:

class Program
{
    static Task Main(string[] args) =>
        CreateHostBuilder(args).Build().RunAsync();

    static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureLogging((_, logging) =>
                logging.ClearProviders()
                    .AddConsole(options => options.IncludeScopes = true));
}

Konak olmayan konsol uygulaması

Genel ana bilgisayarı olmayan uygulamalar için günlük kaydı kodu, sağlayıcıların Eklenme ve günlükçülerin oluşturulduğuyönteme göre farklılık gösterir. Konak olmayan bir konsol uygulamasında, Add{provider name} oluşturma sırasında sağlayıcının uzantı yöntemini çağırın LoggerFactory :

class Program
{
    static void Main(string[] args)
    {
        using var loggerFactory = LoggerFactory.Create(builder =>
        {
            builder
                .AddFilter("Microsoft", LogLevel.Warning)
                .AddFilter("System", LogLevel.Warning)
                .AddFilter("LoggingConsoleApp.Program", LogLevel.Debug)
                .AddConsole();
        });

        ILogger logger = loggerFactory.CreateLogger<Program>();
        logger.LogInformation("Example log message");
    }
}

loggerFactoryNesne bir örnek oluşturmak için kullanılır ILogger .

Ana oturum oluşturma

Aşağıdaki kod, Main ILogger konak oluşturulduktan sonra bir örneğinden bir örnek alarak oturum açar:

using System;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;

class Program
{
    static Task Main(string[] args)
    {
        IHost host = Host.CreateDefaultBuilder(args).Build();

        var logger = host.Services.GetRequiredService<ILogger<Program>>();
        logger.LogInformation("Host created.");

        return host.RunAsync();
    }
}

Zaman uyumsuz günlükçü yöntemi yok

Günlüğe kaydetme, zaman uyumsuz kodun performans maliyetine değer olmaması kadar hızlı olmalıdır. Günlüğe kaydetme veri deposu yavaşsa doğrudan yazma. Günlük iletilerini başlangıçta hızlı bir mağazaya yazmayı ve sonra bunları yavaş depoya daha sonra taşımayı düşünün. örneğin, SQL Server oturum açarken Log yöntemler zaman uyumlu olduğundan doğrudan bir yöntemde yapmayın Log . Bunun yerine, günlük iletilerini bir bellek içi kuyruğa eşzamanlı olarak ekleyin ve bir arka plan çalışanı, SQL Server veri gönderme zaman uyumsuz çalışmasını sağlamak için iletileri kuyruktan çekin.

Çalışan bir uygulamadaki günlük düzeylerini değiştirme

Günlüğe kaydetme API 'SI, bir uygulama çalışırken günlük düzeylerini değiştirme senaryosu içermez. Ancak, bazı yapılandırma sağlayıcıları yapılandırmayı yeniden yükleme yeteneğine sahiptir ve bu, günlüğe kaydetme yapılandırması üzerinde etkili bir şekilde gerçekleşir. Örneğin, dosya yapılandırma sağlayıcısı günlük yapılandırmasını varsayılan olarak yeniden yükler. Uygulama çalışırken kodda yapılandırma değiştirilirse uygulama, uygulamanın günlük yapılandırmasını güncelleştirmek için IController. Reload ' i çağırabilir.

NuGet paketleri

ILogger<TCategoryName>Ve ILoggerFactory arabirimleri ve uygulamaları .NET SDK 'ya dahil edilmiştir. bunlar ayrıca aşağıdaki NuGet paketlerinde de mevcuttur:

Koddaki günlük filtresi kurallarını Uygula

Günlük filtresi kurallarını ayarlamak için tercih edilen yaklaşım yapılandırmakullanmaktır.

Aşağıdaki örnek, koddaki filtre kurallarının nasıl kaydedileceği gösterilmektedir:

class Program
{
    static Task Main(string[] args) =>
        CreateHostBuilder(args).Build().RunAsync();

    static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureLogging(logging =>
               logging.AddFilter("System", LogLevel.Debug)
                  .AddFilter<DebugLoggerProvider>("Microsoft", LogLevel.Information)
                  .AddFilter<ConsoleLoggerProvider>("Microsoft", LogLevel.Trace));
}

logging.AddFilter("System", LogLevel.Debug)``SystemKategori ve günlük düzeyini belirtir Debug . Belirli bir sağlayıcı yapılandırılmadığı için filtre tüm sağlayıcılara uygulanır.

AddFilter<DebugLoggerProvider>("Microsoft", LogLevel.Information) belirtir

  • DebugGünlüğe kaydetme sağlayıcısı.
  • Günlük düzeyi Information ve üzeri.
  • İle başlayan tüm kategoriler "Microsoft" .

Ayrıca bkz.