Aracılığıyla paylaş


.NET ve ASP.NET Core'da oturum açma

Note

Bu, bu makalenin en son sürümü değildir. Geçerli sürüm için bu makalenin .NET 10 sürümüne bakın.

Warning

ASP.NET Core'un bu sürümü artık desteklenmiyor. Daha fazla bilgi için bkz . .NET ve .NET Core Destek İlkesi. Geçerli sürüm için bu makalenin .NET 10 sürümüne bakın.

Bu makalede, ASP.NET Core uygulamalarında oturum açma işlemi açıklanmaktadır. .NET'te günlük kaydetme hakkında genel yönergeler için bkz. C# ve .NET'te günlüğe kaydetme. Bu Blazor kılavuzu ekleyen veya bu kılavuzun yerini alan günlüğe kaydetme kılavuzu için bkz. ASP.NET Çekirdek Blazor günlüğü.

Günlüğe kaydetme sağlayıcıları

ASP.NET Core, ILogger API aracılığıyla yüksek performanslı ve yapılandırılmış günlük kaydını destekleyerek uygulama davranışını izlemenize ve sorunları tanılamanıza yardımcı olur. Günlükler, farklı hedeflere yazılmak üzere günlük sağlayıcılar yapılandırılarak yönetilir. Bir dizi kayıt sağlayıcısı çerçevede dahili olarak bulunur ve birçok üçüncü taraf sağlayıcı mevcuttur. Bir uygulamada birden çok sağlayıcı etkinleştirilebilir.

Çoğu günlük sağlayıcısı, günlük iletilerini bir veri depolama sistemine yazar. Örneğin, Azure Application Insights günlük sağlayıcısı günlükleri Azure Application Insights'ta depolar. Bir sağlayıcı olan Console sağlayıcı yalnızca günlük iletilerini görüntüler. Sağlayıcı Console , gerçek zamanlı olarak izleme ve hata ayıklama için bir uygulamayı yerel olarak çalıştırırken kullanışlıdır.

ASP.NET Core web uygulaması proje şablonundan oluşturulan uygulamalar, uygulamanın WebApplication.CreateBuilder dosyasında Program çağrısını yapar ve bu da aşağıdaki varsayılan günlük sağlayıcılarını ekler:

var builder = WebApplication.CreateBuilder(args);

Varsayılan günlük sağlayıcılarını geçersiz kılmak için, ClearProviders üzerinde WebApplicationBuilder.Logging çağırın ve günlük sağlayıcılarını eklemek için oturum açma sağlayıcısı genişletme yöntemlerini kullanın. Aşağıdaki örnek yalnızca Console günlük sağlayıcısını ayarlar:

var builder = WebApplication.CreateBuilder(args);

builder.Logging.ClearProviders();
builder.Logging.AddConsole();

Alternatif olarak, yukarıdaki kod ILoggingBuilderConfigureLogging aşağıdaki gibi yazılabilir:

var builder = WebApplication.CreateBuilder(args);

builder.Host.ConfigureLogging(logging =>
{
    logging.ClearProviders();
    logging.AddConsole();
});

ASP.NET Core web uygulaması proje şablonundan oluşturulan uygulamalar, aşağıdaki varsayılan günlük sağlayıcılarını eklemek için Host.CreateDefaultBuilder çağrısını yapar:

Host.CreateDefaultBuilder(args)

Varsayılan günlük sağlayıcılarını geçersiz kılmak için, ClearProviders fonksiyonunu çağırarak ILoggerProvider'deki tüm ILoggingBuilder örneklerini kaldırın ve günlük sağlayıcıları eklemek için günlük sağlayıcısı uzantı yöntemlerini kullanın. Aşağıdaki örnek yalnızca Console günlük sağlayıcısını ayarlar:

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureLogging(logging =>
        {
            logging.ClearProviders();
            logging.AddConsole();
        })
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup<Startup>();
        });

Ek sağlayıcılar Yerleşik günlük sağlayıcıları ve Üçüncü taraf günlük sağlayıcıları bölümlerinde ele alınmıştır.

Log çıktısı

Varsayılan günlük sağlayıcıları tarafından oluşturulan günlükler görüntülenir:

  • Visual Studio'da
    • Hata Ayıkla çıktısı penceresinde hata ayıklarken.
    • ASP.NET Core Web Server penceresinde.
  • Komut kabuğunda, uygulama dotnet run komutuyla çalıştırıldığında.

.NET ve genel olarak ASP.NET Core aynı günlük API'sini ve sağlayıcılarını kullanır. Daha fazla bilgi, C# ve .NET'te Günlüğe Kaydetme bölümünde, C# ve .NET için genel günlük senaryolarını kapsayan bölümde bulunabilir. Bu makale ASP.NET Core uygulama günlüğüne odaklanıyor.

Günlük iletileri oluşturma

Günlük iletileri oluşturmak için ILogger<TCategoryName> bir nesne kullanın.

Aşağıdaki örnekler:

  • Türün tam adını temel alan bir günlük ILogger belirten bir oluşturun. Günlük kategorisi, günlük iletilerini tanımlamak, sıralamak ve filtrelemek için yararlı olan her günlükle ilişkili bir dizedir. Günlük kategorileri hakkında daha fazla bilgi bu makalenin devamında verilmiştir.
  • LogInformation düzeyinde günlüğe kaydetmek için Information yöntemini çağırır. Günlük düzeyi , günlüğe kaydedilen olayın önem derecesini gösterir. Günlük düzeyleri hakkında daha fazla bilgi bu makalenin ilerleyen kısımlarında verilmiştir.

Bir uygulamadaki aşağıdaki sayaç sayfasında (CounterRazorbileşen), BlazorILogger<Counter> ile bir @inject eklenir. Yöntem (Logger) çağrıldığında bilgileri günlüğe kaydetmek için günlükleyici örneği (IncrementCount) kullanılır.

Pages/Counter.razor:

@page "/counter"
@inject ILogger<Counter> Logger

<h1>Counter</h1>

<p>Current count: @currentCount</p>

<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>

@code {
    private int currentCount = 0;

    private void IncrementCount()
    {
        Logger.LogInformation("Someone incremented the counter!");

        currentCount++;
    }
}

Note

.NET 5 veya önceki sürümlerinde, @using günlük API tamamlamalarını desteklemek için bileşenlerde bir Microsoft.Extensions.Logging yönergesi gereklidir.

Günlük iletisi:

BlazorSample.Components.Pages.Counter: Information: Someone incremented the counter!

Günlük kategorisi BlazorSample.Components.Pages.Counter ve günlük düzeyi (önem derecesi) Information şudur. Mesaj şöyledir: Someone incremented the counter!.

Aşağıdaki Razor Pages gizlilik sayfası sınıf dosyasında, sayfa ziyaret edildiğinde günlüğe kaydedilmesi için sınıfın oluşturucusuna bir ILogger<PrivacyModel> enjekte edilir. Bu örnekte, iletinin geçerli UTC tarih ve saatini () alan ve günlük iletisine yazan bir DateTime.UtcNow olduğunu unutmayın. Günlük iletisi şablonları, bu makalenin devamında yer alan Günlük iletisi şablonu bölümünde ele alınmıştır.

Pages/Privacy.cshtml.cs:

public class PrivacyModel(ILogger<PrivacyModel> logger) : PageModel
{
    public void OnGet() => logger.LogInformation("Privacy page visited at {DT}", 
        DateTime.UtcNow);
}

Günlük iletisi şablonu

Günlük iletisi şablonu, sağlanan bağımsız değişkenler için yer tutucular içerebilir. Yer tutucular için sayı değil ad kullanın.

Aşağıdaki örneklerde, {Id} öğe kimliği için bir tanımlayıcı yer tutucusu ve id tanımlayıcı parametresidir.

Logger.LogInformation(LogEvent.GetItem, "Getting item {Id}", id);
Logger.LogWarning(LogEvent.GetItemNotFound, "Get({Id}) NOT FOUND", id);

Günlük iletilerinde yer tutucu değerlerini sağlamak için hangi parametrelerin kullanılacağını yer tutucu adları değil parametrelerin sırası belirler. Aşağıdaki kodda, ileti şablonunun yer tutucularında parametre adları sıralı değildir:

var apples = 1;
var pears = 2;
var bananas = 3;

Logger.LogInformation("{Pears}, {Bananas}, {Apples}", apples, pears, bananas);

Bununla birlikte parametreler yer tutuculara sırayla atanır: apples, pears, bananas. Günlük iletisi parametrelerin sırasını yansıtır:

1, 2, 3

Bu yaklaşım günlük sağlayıcılarının anlamsal veya yapılandırılmış günlük uygulamalarına olanak tanır. Bağımsız değişkenlerin kendileri yalnızca biçimlendirilmiş ileti şablonuna değil günlük sistemine geçirilir. Bu sayede günlük sağlayıcıları parametre değerlerini alanlar olarak depolayabilir. Örneğin, aşağıdaki günlükçü yöntemini ele alalım:

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

Azure Tablo Depolama'da oturum açarken:

  • Her Azure Tablo varlığının ID ve RequestTime özellikleri olabilir.
  • Özellikleri olan tablolar, günlüğe kaydedilmiş veriler üzerinde çalıştırılan sorguları basitleştirir. Örneğin bir sorgu, metin iletisinden zamanı ayıklamak zorunda kalmadan belirli bir RequestTime aralığındaki tüm günlükleri bulabilir.

Uygulama başlangıcında günlüğe kaydetme

Aşağıdaki örnek, bilgi iletilerini günlüğe kaydetmek için WebApplication.Logger dosyasında Program fonksiyonunu çağırır.

var builder = WebApplication.CreateBuilder(args);

var app = builder.Build();

app.Logger.LogInformation("Adding Routes");

app.MapGet("/", () => "Hello World!");

app.Logger.LogInformation("Starting the app");

app.Run();

Aşağıdaki örnek uç noktayı çağırır AddConsole ve günlüğe /Test kaydeder:

var builder = WebApplication.CreateBuilder(args);

builder.Logging.AddConsole();

var app = builder.Build();

app.MapGet("/", () => "Hello World!");

app.MapGet("/Test", async (ILogger<Program> logger, HttpResponse response) =>
{
    logger.LogInformation("'Test' logging in the Program file");
    await response.WriteAsync("Testing");
});

app.Run();

Aşağıdaki örnek, AddSimpleConsole çağrı yapar, konsol biçimlendirici seçeneğiyle renkli çıktıyı devre dışı bırakır ve uç noktada günlük kaydı yapar:

using Microsoft.Extensions.Logging.Console;

var builder = WebApplication.CreateBuilder(args);

builder.Logging.AddSimpleConsole(
    option => option.ColorBehavior = LoggerColorBehavior.Disabled);

var app = builder.Build();

app.MapGet("/", () => "Hello World!");

app.MapGet("/Test", async (ILogger<Program> logger, HttpResponse response) =>
{
    logger.LogInformation("'Test' logging in the Program file");
    await response.WriteAsync("Testing");
});

app.Run();

Aşağıdaki kod, konağı derledikten sonra DI'den bir Program.Main örnek alarak oturum açarILogger:

public static void Main(string[] args)
{
    var host = CreateHostBuilder(args).Build();

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

    host.Run();
}

Aşağıdaki örnek, ILogger'yi Startup.Configure'ye nasıl yerleştireceğinizi gösterir:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILogger<Startup> logger)
{
    logger.LogInformation("'Startup'.Configure' logging");

    ...
}

Günlük kaydı, bağımlılık enjeksiyonuna (DI) ve dolayısıyla yapılandırmaya bağlı olduğundan, Startup oluşturucusuna veya Startup.ConfigureServices metoduna günlükçü eklemesi desteklenmez. DI kapsayıcısı, ConfigureServices işlemi tamamlanana kadar ayarlanmaz.

Hangi sebeple önceki sürümlerde ILogger içine günlükçü oluşturucu enjeksiyonu Startup çalıştı veya ILogger'ye bağımlı bir hizmeti nasıl yapılandırılacağı hakkındaki bilgiyi edinmek için Bir hizmeti yapılandırma bölümüne bakın.

Log kaydını yapılandırma

ILogger nesnesi oluşturulduğunda bir kategori belirtilir. Bu kategori, bu log aracı örneği tarafından oluşturulan her log mesajına eklenir.

Günlük düzeyi, günlük iletilerinin ayrıntı düzeyini uygulamanın tamamı ve belirli uygulama derlemeleri için varsayılan düzeyde belirler. Günlük düzeyi yapılandırma sağlayıcılarından herhangi biri tarafından ayarlanabilir.

Uygulama ayarları

Günlük yapılandırması genellikle Logging dosyalarının appsettings.{ENVIRONMENT}.json bölümü tarafından sağlanır; burada {ENVIRONMENT} yer tutucusu ortamdır. Aşağıdaki appsettings.Development.json dosyası ASP.NET Core web uygulaması şablonları tarafından oluşturulur:

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

Yukarıdaki JSON kodunda:

  • "Default" ve "Microsoft.AspNetCore" kategorileri belirtilir.
  • "Microsoft.AspNetCore" kategorisi "Microsoft.AspNetCore" ile başlayan tüm kategorilere uygulanır. Örneğin bu ayar "Microsoft.AspNetCore.Routing.EndpointMiddleware" kategorisine uygulanır.
  • Kategori "Microsoft.AspNetCore", günlük seviyesi Warning ve daha yüksek (daha ciddi) olanlar şeklinde kaydedilir.
  • Belirli bir günlük sağlayıcısı belirtilmediğinden, LogLevelWindows EventLogdışındaki tüm etkin günlük sağlayıcıları için geçerlidir.

Logging özelliğinin LogLevel ve günlük sağlayıcısı özellikleri olabilir. LogLevel, seçili kategorileri günlüğe kaydetmek için en düşük düzeyi belirtir. Önceki JSON'da Information ve Warning günlük düzeyleri belirtilir. LogLevels, önem derecelerini gösterir ve bu değerler aşağıdaki tabloda karşılık gelen enum değerleriyle belirtilmiştir.

Günlük Düzeyi Value
Trace 0
Debug 1
Information 2
Warning 3
Error 4
Critical 5
None 6

LogLevel belirtildiğinde, belirtilen düzeydeki ve daha yüksek düzeydeki iletiler için günlük kaydı etkinleştirilir. Önceki JSON'da, Default kategori ve üzeri için Information günlüğe kaydedilir. Örneğin Information, Warning, Error ve Critical iletileri günlüğe kaydedilir. LogLevel belirtilmezse günlüğe kaydetme için varsayılan Information düzeyi kullanılır. Daha fazla bilgi için bkz. Günlük düzeyleri.

Sağlayıcı özelliği bir LogLevel özelliği belirtebilir. Sağlayıcının altındaki LogLevel, söz konusu sağlayıcı için günlüğe alınacak düzeyleri belirtir ve sağlayıcı dışı günlük ayarlarını geçersiz kılar. Aşağıdaki appsettings.json dosyasını göz önünde bulundurun:

{
  "Logging": {
    "LogLevel": { // All providers, LogLevel applies to all the enabled providers.
      "Default": "Error", // Default logging, Error and higher.
      "Microsoft": "Warning" // All Microsoft* categories, Warning and higher.
    },
    "Debug": { // Debug provider.
      "LogLevel": {
        "Default": "Information", // Overrides preceding LogLevel:Default setting.
        "Microsoft.Hosting": "Trace" // Debug:Microsoft.Hosting category.
      }
    },
    "EventSource": { // EventSource provider
      "LogLevel": {
        "Default": "Warning" // All categories of EventSource provider.
      }
    }
  }
}

Logging.{PROVIDER NAME}.LogLevel sağlayıcısındaki ayarlar Logging.LogLevel ayarlarını geçersiz kılar; burada {PROVIDER NAME} yer tutucusu sağlayıcı adıdır. Yukarıdaki JSON'da sağlayıcının Debug varsayılan günlük düzeyi olarak Informationayarlanır:

Logging:Debug:LogLevel:Default:Information

Yukarıdaki ayar Information dışındaki tüm Logging:Debug: kategorileri için Microsoft.Hosting günlük düzeyini belirtir. Belirli bir kategori listelendiğinde, listelenen kategori varsayılan kategoriyi geçersiz kılar. Önceki JSON'da, Logging:Debug:LogLevel içindeki ayarları "Microsoft.Hosting"kategoriler "Default" ve Logging:LogLevel geçersiz kılar.

Aşağıdakiler için en düşük günlük düzeyi belirtilebilir:

  • Belirli sağlayıcılar örneği: Logging:EventSource:LogLevel:Default:Information
  • Belirli kategoriler örneği: 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:

  • Sağlayıcıya geçirilmez.
  • Günlüğe kaydedilmez veya görüntülenmez.

Tüm günlükleri engellemek için LogLevel.None belirtin. LogLevel.None değeri 6'dır ve bu değer LogLevel.Critical (5) değerinden yüksektir.

Sağlayıcı günlük kapsamlarını destekliyorsa IncludeScopes bunların etkinleştirilip etkinleştirilmediğini gösterir. Daha fazla bilgi için bkz. Günlük kapsamları.

Aşağıdaki appsettings.json dosyası varsayılan olarak etkinleştirilen tüm sağlayıcıları içerir:

{
  "Logging": {
    "LogLevel": { // No provider, LogLevel applies to all the enabled providers.
      "Default": "Error",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Warning"
    },
    "Debug": { // Debug provider.
      "LogLevel": {
        "Default": "Information" // Overrides preceding LogLevel:Default setting.
      }
    },
    "Console": {
      "IncludeScopes": true,
      "LogLevel": {
        "Microsoft.AspNetCore.Mvc.Razor.Internal": "Warning",
        "Microsoft.AspNetCore.Mvc.Razor.Razor": "Debug",
        "Microsoft.AspNetCore.Mvc.Razor": "Error",
        "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.
  • Logging.{PROVIDER NAME}.LogLevel sağlayıcısındaki ayarlar Logging.LogLevel ayarlarını geçersiz kılar; burada {PROVIDER NAME} yer tutucusu sağlayıcı adıdır. Örneğin Debug.LogLevel.Default düzeyi LogLevel.Default düzeyini geçersiz kılar.
  • Her varsayılan sağlayıcı diğer adı kullanılır. Her sağlayıcı, yapılandırmada tam tür adı yerine kullanılacak bir diğer ad tanımlar. Yerleşik sağlayıcı diğer adları şunlardır:
    • Console
    • Debug
    • EventSource
    • EventLog
    • AzureAppServicesFile
    • AzureAppServicesBlob
    • ApplicationInsights

Komut satırı

Günlük yapılandırması için ortam değişkenleri bir komut kabuğu aracılığıyla ayarlanabilir.

: ayıracı, tüm platformlarda ortam değişkeni hiyerarşik anahtarlarıyla çalışmaz. Örneğin, : ayırıcı Bash tarafından desteklenmez. Çift alt çizgi, __, tüm platformlar tarafından desteklenir ve otomatik olarak iki nokta, :, ile değiştirilir.

Windows'ta set komutuyla geçerli komut satırı için bir ortam değişkeni ayarlayın. Aşağıdaki örnekte ortam anahtarı Logging:LogLevel:Microsoft değerine ayarlanmıştır Information. Ayarı, ASP.NET Core web uygulaması proje şablonundan oluşturulan herhangi bir uygulamayla test edebilirsiniz.

set Logging__LogLevel__Microsoft=Information

dotnet run komutunu çalıştırdıktan sonra, proje dizininde set komutunu çalıştırın.

dotnet run

Önceki ortam değişkeni:

  • Yalnızca geçerli komut kabuğundan başlatılan uygulamalar için ayarlanır.
  • Visual Studio veya Visual Studio Code tarafından başlatılan tarayıcılar tarafından okunmuyor.

Ortaml değişkenini komut kabuğu örnekleri arasında kalıcı hale getirmek için setx öğesini kullanın. /M anahtarı, değişkeni sistem ortamında ayarlar. /M kullanılmazsa bir kullanıcı ortamı değişkeni ayarlanır.

setx Logging__LogLevel__Microsoft Information /M

Note

macOS ve Linux'ta (nokta) içeren . adlarla ortam değişkenlerini yapılandırırken, "Bir değişkeni nokta (.) ile dışarı aktarma" konusunu göz önünde bulundurun. "Stack Exchange'deki soru ve buna karşılık gelen kabul edilen yanıt.

Azure App Service’i yapılandırma

Azure App Service'te, günlük ortam değişkenlerini ayarlamak için App Service uygulamasını yapılandırma bölümündeki yönergeleri izleyin.

Daha fazla bilgi için bkz. Azure Uygulaması s: Azure portalını kullanarak uygulama yapılandırmasını geçersiz kılma.

Günlük kategorisi

ILogger nesnesi oluşturulduğunda bir kategori belirtilir. Logger örneğinin oluşturduğu her log mesajına kategori eklenir. Kategori dizesi rastgeledir, ancak kural tam sınıf adını kullanmaktır. ASP.NET Core web uygulamaları, ILogger<T> kullanarak, T tam tür adını kategori olarak kullanan bir günlükçü örneği oluşturur.

Kategori adı "Microsoft" ile başlayan günlük iletileri .NET platformundan gelir. Genellikle, uygulamaya ait olan günlük iletileri, uygulamanın derleme adıyla başlayanlardır. .NET dışındaki paketler genellikle paketteki bir derleme adına bağlı olarak bir kategoriye sahiptir. Yaygın günlük kategorilerinin listesi için Ortak günlük kategorileri bölümüne bakın.

Razor bileşeninin, Blazor uygulamasında, T türünün bir Counter bileşeni tarafından işlenen bir sayaç sayfası için Counter olduğu durum (Pages/Counter.razor):

@inject ILogger<Counter> Logger

Bir Razor Sayfalar sayfası sınıf modelinde, tür T bir gizlilik sayfası (PrivacyModel) için Pages/Privacy.cshtml.cs olduğunda:

public class PrivacyModel(ILogger<PrivacyModel> logger) : PageModel

Daha fazla kategori isteniyorsa, kural ILoggerFactory.CreateLogger kullanarak tam sınıf adına bir alt kategori ekleyip hiyerarşik bir ad kullanmaktır. Bu yaklaşım, günlük iletilerinin kapsamını bileşen veya sınıf yöntemlerine göre belirlemede kullanışlıdır.

Aşağıdaki Counter bileşeni, IncrementByOne kategorisi ile BlazorSample.Components.Pages.Counter.IncrementByOne yönteminden ve IncrementByTen kategorisi ile BlazorSample.Components.Pages.Privacy.IncrementByTen yönteminden günlüğe kaydeder.

Pages/Counter.razor:

@page "/counter"
@inject ILogger<Counter> Logger

<h1>Counter</h1>

<p>Current count: @currentCount</p>

<button class="btn btn-primary" @onclick="IncrementByOne">Click me (+1)</button>
<button class="btn btn-primary" @onclick="IncrementByTen">Click me (+10)</button>

@code {
    private int currentCount = 0;

    private void IncrementByOne()
    {
        var logger = Logger.CreateLogger($"{typeof(Counter)}.IncrementByOne");
        Logger.LogInformation("Someone incremented the counter!");
        currentCount++;
    }

    private void IncrementByTen()
    {
        var logger = Logger.CreateLogger($"{typeof(Counter)}.IncrementByTen");
        Logger.LogInformation("Someone incremented the counter!");
        currentCount += 10;
    }
}

kayıt iletileri:

BlazorSample.Components.Pages.Counter.IncrementByOne: Information: Someone incremented the counter!
BlazorSample.Components.Pages.Counter.IncrementByTen: Information: Someone incremented the counter!

Razor Sayfa modelinin tamamı için özel kategori ("CustomCategory") kullanan sayfalar sayfa sınıfı modelinde:

public class PrivacyModel(ILoggerFactory logger) : PageModel
{
    private readonly ILogger _logger = 
        logger.CreateLogger($"{typeof(PrivacyModel)}.CustomCategory");

    public void OnGet() =>
        _logger.LogInformation("Privacy page visited");
}

Günlük olayı kimliği

Her günlük iletisi bir olay kimliği belirtebilir. Aşağıdaki örnek, bir uygulama tarafından kullanılmak üzere bir dizi özel olay kimliği oluşturur. Kimliklerin oluşturma, okuma, güncelleştirme ve silme (CRUD) işlemleri için 1.000 aralığında, test günlüğü için 3.000 ve bulunamaz senaryolar için 4.000 aralığında bulunduğuna dikkat edin:

public class LogEvent
{
    public const int GenerateItems      = 1000;
    public const int ListItems          = 1001;
    public const int GetItem            = 1002;
    public const int InsertItem         = 1003;
    public const int UpdateItem         = 1004;
    public const int DeleteItem         = 1005;

    public const int TestItem           = 3000;

    public const int GetItemNotFound    = 4000;
    public const int UpdateItemNotFound = 4001;
}

Razor bileşen kodunda, bir ILogger<T> örneği (Logger) eklendiğinde kullanılır:

  • Kimlik LogEvent.GetItem (1002), bir öğeyi tanımlayıcısına göre (id) almak için bilgilendirici günlük iletisiyle birlikte kullanılır.
  • Öğe LogEvent.GetItemNotFound bulunamazsa, kimlik (4000) uyarı günlüğü iletisiyle birlikte kullanılır.
Logger.LogInformation(LogEvent.GetItem, "Getting item {Id}", id);

var todoItem = await TodoItemService.FindAsync(id);

if (todoItem == null)
{
    Logger.LogWarning(LogEvent.GetItemNotFound, "Get({Id}) NOT FOUND", id);

    return NotFound();
}

Günlük sağlayıcısı olay kimliğini bir kimlikte (kimlikte filtrelemeye izin verir) veya günlük iletisinde depolayabilir ya da hiç depolamayabilir. Sağlayıcı Debug olay kimliklerini göstermez. Konsol sağlayıcısı olay kimliklerini kategorinin arkasında köşeli ayraç içinde gösterir:

info: BlazorSample.Components.Pages.Items[1002]
      Getting item 1
warn: BlazorSample.Components.Pages.Items[4000]
      Get(1) NOT FOUND

Günlük düzeyi

Aşağıdaki tabloda günlüğe kaydetme düzeyleri en düşükten en yüksek önem derecesine, karşılık gelen enum değerleri ve kolaylık genişletme yöntemleri açıklanmaktadır.

LogLevel Value Method Description
Trace 0 LogTrace En ayrıntılı iletileri içerir. Bu iletiler hassas uygulama verileri içerebilir. Bu iletiler varsayılan olarak devre dışı bırakılmıştır ve üretimde etkinleştirilmemesi gerekir.
Debug 1 LogDebug Hata ayıklama ve geliştirme için. Üretimde, günlüğe kaydedilen iletilerin yüksek hacmi nedeniyle dikkatli kullanın.
Information 2 LogInformation Uygulamanın genel akışını izler.
Warning 3 LogWarning Anormal veya beklenmeyen olaylar için. Normalde uygulamanın başarısız olmasına neden olmayan hataları veya koşulları içerir.
Error 4 LogError Genellikle işlenmeyen hatalar ve özel durumlar için kullanılır. Bu iletiler uygulama genelindeki bir hatayı değil geçerli işlem veya istekteki hatayı gösterir.
Critical 5 LogCritical Veri kaybı veya disk alanı yetersizliği gibi hemen dikkat gerektiren hatalar için.
None 6 Bir günlük kategorisinin ileti yazmaması gerektiğini belirtir.

Log yönteminin ilk parametresi olan LogLevel günlüğün önem derecesini gösterir. Çoğu geliştirici, Log(LogLevel, ...) çağırmak yerine LoggerExtensions yöntemlerini çağırır. Örneğin, aşağıdaki iki loglama çağrısı işlevsel olarak eşdeğerdir ve bir ILogger<T> bileşeninde enjekte edilen Logger örneği (Razor) temel alınarak aynı sonucu üretir:

Logger.Log(LogLevel.Information, LogEvent.TestItem, routeInfo);

Logger.LogInformation(LogEvent.TestItem, routeInfo);

Note

LogEvent.TestItem bir log olay kimliğidir.

Belirli bir depolama ortamına yazılacak günlük çıktısını kontrol etmek için uygun bir günlükleme seviyesi belirleyin.

  • Üretimde:
    • , Traceveya Debug düzeylerinde günlüğe Informationkaydetmek, yüksek hacimli ayrıntılı günlük iletileri oluşturur. Maliyetleri denetlemek ve veri depolama sınırlarını aşmamak için bu düzeylerde yüksek hacimli, düşük maliyetli bir veri deposuna oturum açın. Bu düzeyleri belirli kategorilerle sınırlamayı göz önünde bulundurun.
    • Kayıt günlüğüne Warning ile Critical düzeylerinde kaydetme işlemi genellikle az sayıda kayıt mesajı üretir.
      • Maliyetler ve depolama sınırları genellikle sorun değildir.
      • Az sayıda günlük veri deposu seçimlerine daha fazla esneklik getirir.
  • Geliştirme aşamasında:
    • Varsayılan günlük kaydı için Information düzeyini ("Default": "Information") ve Microsoft ASP.NET Core derlemeleri için Warning düzeyini ("Microsoft.AspNetCore": "Warning") öneririz.
    • Sorun giderme sırasında Trace, Debug veya Information iletileri ekleyin. Çıkışı sınırlamak için, yalnızca inceleme altındaki kategoriler için bu günlük seviyelerini ayarlayın.

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

Logging API'si, bir uygulama çalışırken günlük düzeylerinin değiştirilmesine destek sağlamaz. Bununla birlikte bazı yapılandırma sağlayıcıları yapılandırmayı yeniden yükleyebilir ve bu işlem günlük yapılandırmasını hemen etkiler. Ö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, uygulamanın günlük yapılandırmasını güncelleştirmek için uygulama IConfigurationRoot.Reload çağrısı yapabilir.

Filtreleme kuralları nasıl uygulanır?

Bir ILogger<TCategoryName> nesnesi oluşturulduğunda ILoggerFactory nesnesi bu günlükçüye uygulamak üzere sağlayıcı başına tek bir kural seçer. ILogger örneği tarafından yazılan tüm iletiler seçilen kurallar temelinde filtrelenir. Kullanılabilir kurallar arasından her sağlayıcı ve kategori çifti için en belirgin kural seçilir.

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

  • Sağlayıcıyla veya sağlayıcının diğer adıyla eşleşen tüm kuralları seçin. Eşleşme bulunamazsa sağlayıcısı boş olan tüm kurallar seçilir.
  • Önceki adımın sonucundan, eşleşen kategori ön eki en uzun olan kuralları seçin. Eşleşme bulunamazsa bir kategori belirtmeyen tüm kuralları seçin.
  • Birden çok kural seçildiyse, sonuncusunu alın.
  • Hiçbir kural seçilmezse MinimumLevel kullanın.

ILogger ve ILoggerFactory

ILogger<TCategoryName> ve ILoggerFactory arabirimleri ve uygulamaları .NET SDK'sında bulunur. Bunlar aşağıdaki NuGet paketlerinde de sağlanır:

Günlük özel durumları

Günlükçü yöntemlerinde özel durum parametresi alan aşırı yüklemeler vardır:

try
{
   ...

   throw new Exception("Test exception");
}
catch (Exception ex)
{
    Logger.LogWarning(LogEvent.GetItemNotFound, ex, "Test exception at {DT}", 
        DateTime.UtcNow);
}

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

Varsayılan günlük düzeyi

Varsayılan günlük düzeyi açıkça ayarlı değilse, varsayılan günlük düzeyi olur Information.

Varsayılan günlük düzeyi yapılandırmada ayarlı değilse, LoggingBuilderExtensions.SetMinimumLevel ile ayarlanabilir. Aşağıdaki örnek, Warning düzeyini varsayılan günlük düzeyi olarak ayarlar.

var builder = WebApplication.CreateBuilder();

builder.Logging.SetMinimumLevel(LogLevel.Warning);

Varsayılan en düşük günlük düzeyini C# kodunda değil, yapılandırma ayarlarında ayarlamanızı öneririz.

Filter işlevi

Yapılandırma veya koda göre atanmış kuralları olmayan tüm sağlayıcılar ve kategoriler için bir filtre işlevi çağrılır. Aşağıdaki örnek, kategori Page veya Microsoft içerdiğinde ve günlük düzeyi Information veya daha yüksek olduğunda konsol günlüklerini görüntüler:

var builder = WebApplication.CreateBuilder();

builder.Logging.AddFilter((provider, category, logLevel) =>
{
    if (provider is not null && category is not null)
    {
        return provider.Contains("ConsoleLoggerProvider")
            && (category.Contains("Page") || category.Contains("Microsoft"))
            && logLevel >= LogLevel.Information;
    }

    return false;
});

Günlük düzeylerini filtre işlevlerine sahip kodda değil, yapılandırmada tanımlamanızı öneririz.

ASP.NET Çekirdek kategorileri

Aşağıdaki tabloda, ASP.NET Core tarafından kullanılan bazı günlük kategorileri yer alır.

Category Notes
Microsoft.AspNetCore Genel ASP.NET Core tanılamaları.
Microsoft.AspNetCore.DataProtection Hangi veri koruma anahtarlarının değerlendirildiği, bulunduğu ve kullanıldığı.
Microsoft.AspNetCore.HostFiltering Konaklara izin verilir.
Microsoft.AspNetCore.Hosting HTTP isteklerini tamamlamanın ne kadar sürdüğü ve bunların ne zaman başlatıldığı. Hangi barındırma başlangıç derlemelerinin yüklendiği.
Microsoft.AspNetCore.Mvc MVC ve Razor tanılamaları. Model bağlama, filtre yürütme, derlemeyi görüntüleme ve eylem seçimi.
Microsoft.AspNetCore.Routing Yönlendirmeyi eşleştirme bilgileri.
Microsoft.AspNetCore.Server Bağlantı başlatma, durdurma ve etkin tutma yanıtları. HTTPS sertifikası bilgileri.
Microsoft.AspNetCore.StaticFiles Sunulan dosyalar.

Günlükçü kullanarak Console daha fazla kategori incelemek için bir test uygulamasında ayarlayın appsettings.Development.json :

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

Warning

Kayıtçı çıktısını inceledikten appsettings.Development.json sonra günlük yapılandırmasını önceki düzeylerine Console sıfırlayın.

Entity Framework kategorilerinin listesi için, Basit Günlük: İleti kategorileri (EF Core belgesi) bölümüne bakın.

Günlük kapsamları

Kapsam, bir dizi mantıksal işleci gruplandırabilir. Bu gruplandırma bir kümenin parçası olarak oluşturulan her günlüğe aynı verileri eklemek için kullanılabilir. Örneğin bir işlemi gerçekleştirmenin parçası olarak oluşturulan her günlük işlem kimliğini içerebilir.

Kapsam:

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

Bir kapsamı, günlükçü çağrılarını using bloğunda sarmalayarak kullanın:

public async Task<TodoItem> GetTodoItem(long id)
{
    TodoItem todoItem;
    var transactionId = Guid.NewGuid().ToString();

    using (Logger.BeginScope(new List<KeyValuePair<string, object>>
    {
        new("TransactionId", transactionId),
    }))
    {
        Logger.LogInformation(LogEvent.GetItem, "Getting item {Id}", id);

        todoItem = await TodoItemsService.FindAsync(id);

        if (todoItem == null)
        {
            Logger.LogWarning(LogEvent.GetItemNotFound, "Get({Id}) NOT FOUND", id);

            return NotFound();
        }
    }

    return todoItem;
}

Yerleşik günlük sağlayıcıları

ASP.NET Core, aşağıdaki günlük sağlayıcılarını içerir:

Microsoft tarafından sağlanan aşağıdaki günlük sağlayıcıları, .NET paylaşılan çerçevesinin bir parçası değildir. Uygulamaya eklenen ek bir NuGet paketi olarak yüklenmelidir.

ASP.NET Core günlükleri dosyalara yazmaya yönelik bir günlük sağlayıcısı içermez. ASP.NET Core uygulamasından günlükleri dosyalara yazmak için üçüncü taraf bir günlük sağlayıcısı kullanmayı göz önünde bulundurun.

stdout ve ASP.NET Core Modülü ile hata ayıklama günlüğü hakkında bilgi için bkz. Azure App Service ve IIS'de ASP.NET Core sorunlarını giderme ve IIS için ASP.NET Core Modülü (ANCM).

Console

Console sağlayıcısı günlüklerin çıkışını konsola yönlendirir. Geliştirme sırasında günlükleri görüntüleme hakkında daha fazla bilgi için Console bölümüne bakın.

Debug

Debug sağlayıcısı günlük çıkışını yazarken System.Diagnostics.Debug sınıfını kullanır. System.Diagnostics.Debug.WriteLine çağrıları Debug sağlayıcısına yazar.

Linux'ta Debug sağlayıcısının günlük konumu dağıtıma bağımlıdır ve aşağıdakilerden biri olabilir:

  • /var/log/message
  • /var/log/syslog

EventSource

EventSource sağlayıcısı Microsoft-Extensions-Logging adıyla bir platformlar arası olay kaynağına yazar. Windows'da sağlayıcı ETW kullanır.

dotnet-trace takım seti

Araç dotnet-trace , çalışan bir işlemin .NET izlemelerinin toplanmasını sağlayan platformlar arası bir CLI genel aracıdır. Araç bir Microsoft.Extensions.Logging.EventSource kullanarak LoggingEventSource sağlayıcı verilerini toplar.

Yükleme yönergeleri için bkz. dotnet-trace.

Uygulamadan izleme toplamak için dotnet-trace aracını kullanın:

  1. Uygulamayı dotnet run komutuyla çalıştırın.

  2. .NET uygulamasının işlem tanımlayıcısını (PID) belirleyin:

    dotnet-trace ps
    

    Uygulamanın derlemesiyle aynı adı taşıyan işlemin PID değerini bulun.

  3. dotnet-trace komutunu yürütün.

    Genel komut söz dizimi:

    • {PID}: İşlem tanımlayıcısı
    • {KEYWORD}:Anahtar kelime
    • {PROVIDER LEVEL}: Sağlayıcı düzeyi
    • {LOGGER CATEGORY ...}: Kayıt kategorisi
    • {CATEGORY LEVEL ...}: Kategori düzeyi
    dotnet-trace collect -p {PID} 
        --providers Microsoft-Extensions-Logging:{KEYWORD}:{PROVIDER LEVEL}
            :FilterSpecs=\"
                {LOGGER CATEGORY 1}:{CATEGORY LEVEL 1};
                {LOGGER CATEGORY 2}:{CATEGORY LEVEL 2};
                ...
                {LOGGER CATEGORY N}:{CATEGORY LEVEL N}\"
    

    PowerShell komut kabuğu kullanıldığında --providers değerini tek tırnak içine alın ('):

    dotnet-trace collect -p {PID} 
        --providers 'Microsoft-Extensions-Logging:{KEYWORD}:{PROVIDER LEVEL}
            :FilterSpecs=\"
                {LOGGER CATEGORY 1}:{CATEGORY LEVEL 1};
                {LOGGER CATEGORY 2}:{CATEGORY LEVEL 2};
                ...
                {LOGGER CATEGORY N}:{CATEGORY LEVEL N}\"'
    

    Windows dışındaki platformlarda çıkış izleme dosyasının biçimini -f speedscope olarak değiştirmek için speedscope seçeneğini ekleyin.

    Aşağıdaki tablo anahtar sözcüğünü ({KEYWORD} yer tutucu) tanımlar.

    Keyword Description
    1 LoggingEventSource hakkındaki meta olaylarını günlüğe kaydeder. ILogger kaynaklı olayları günlüğe kaydetmez.
    2 Message çağrıldığında bile ILogger.Log() olayını açar. Bilgileri programlama yoluyla (biçimlendirilmemiş olarak) sağlar.
    4 FormatMessage çağrıldığında bile ILogger.Log() olayını açar. Bilgilerin biçimlendirilmiş dize sürümünü sağlar.
    8 MessageJson çağrıldığında bile ILogger.Log() olayını açar. Bağımsız değişkenlerin JSON gösterimini sağlar.

    Aşağıdaki tablo sağlayıcı düzeylerini tanımlar.

    Sağlayıcı Düzeyi Description
    0 LogAlways
    1 Critical
    2 Error
    3 Warning
    4 Informational
    5 Verbose

    Bir kategori düzeyi için ayrıştırma, aşağıdaki tabloda gösterildiği gibi bir dize veya sayı olabilir.

    Kategori adlandırılmış değeri Sayısal değer
    Trace 0
    Debug 1
    Information 2
    Warning 3
    Error 4
    Critical 5

    Sağlayıcı düzeyi ve kategori düzeyi:

    • Ters sıradadır.
    • Dize sabitlerinin tümü aynı değildir.

    Belirtilmezse FilterSpecs , EventSourceLogger uygulama sağlayıcı düzeyini kategori düzeyine dönüştürmeyi dener ve tüm kategorilere uygular.

    Sağlayıcı Düzeyi Kategori Düzeyi
    Verbose(5) Debug(1)
    Informational(4) Information(2)
    Warning(3) Warning(3)
    Error(2) Error(4)
    Critical(1) Critical(5)

    Sağlanırsa FilterSpecs , listeye dahil olan tüm kategoriler orada kodlanmış kategori düzeyini kullanır ve diğer tüm kategoriler filtrelenir.

    Aşağıdaki örneklerde şunlar varsayılır:

    • Bir uygulama çalışıyor ve Logger.LogDebug("12345") çağrısı yapıyor.
    • İşlem kimliği (PID) aracılığıyla set PID=12345ayarlanır; burada 12345 gerçek PID'dir.

    Aşağıdaki komutu inceleyin:

    dotnet-trace collect -p %PID% --providers Microsoft-Extensions-Logging:4:5
    

    Yukarıdaki komut:

    • Hata ayıklama iletilerini yakalar.
    • FilterSpecs uygulamaz.
    • Kategoriyi Debugeşleyen düzey 5'i belirtir.

    Aşağıdaki komutu inceleyin:

    dotnet-trace collect -p %PID%  --providers Microsoft-Extensions-Logging:4:5:\"FilterSpecs=*:5\"
    

    Yukarıdaki komut:

    • 5. kategori düzeyi Critical olduğundan hata ayıklama iletilerini yakalamaz.
    • Bir FilterSpecs sağlar.

    Kategori düzeyi 1 Debug belirttiğinden, aşağıdaki komut hata ayıklama iletilerini yakalar.

    dotnet-trace collect -p %PID%  --providers Microsoft-Extensions-Logging:4:5:\"FilterSpecs=*:1\"
    

    Kategori şunu belirttiğinden Debugaşağıdaki komut hata ayıklama iletilerini yakalar:

    dotnet-trace collect -p %PID%  --providers Microsoft-Extensions-Logging:4:5:\"FilterSpecs=*:Debug\"
    

    FilterSpecs günlükçü kategorisi ve kategori düzeyi girdileri ek günlük filtreleme koşullarını temsil eder. FilterSpecs girdilerini ; noktalı virgül karakteriyle ayırın.

    Windows komut kabuğunun kullanıldığı örnek:

    dotnet-trace collect -p %PID% --providers Microsoft-Extensions-Logging:4:2:FilterSpecs=\"Microsoft.AspNetCore.Hosting*:4\"
    

    Yukarıdaki komut:

    • EventSource Sağlayıcı, hatalar için biçimlendirilmiş dizeler (4) üretmek üzere (2).
    • Microsoft.AspNetCore.Hosting günlük düzeyinde (Information) 4 günlüğünü etkinleştirir.
  4. dotnet-trace tuşuna veya Ctrl+C tuşuna basarak aracı durdurun.

    İzleme, trace.nettrace komutunun yürütüldüğü klasörde dotnet-trace adıyla kaydedilir.

  5. İzlemeyi Perfview ile açın. trace.nettrace dosyasını açın ve izleme olaylarını inceleyin.

Uygulama WebApplication.CreateBuilder ile ana bilgisayarı oluşturmuyorsa, EventSource sağlayıcıyı uygulamanın günlük yapılandırmasına ekleyin.

Daha fazla bilgi için bkz.

Perfview

Günlükleri toplamak ve görüntülemek için PerfView yardımcı programını kullanın. ETW günlüklerini görüntülemeye yönelik başka araçlar vardır ama PerfView, ASP.NET Core tarafından yayılan ETW olaylarıyla çalışmak için en iyi deneyimi sağlar.

PerfView'u bu sağlayıcı tarafından günlüğe kaydedilen olayları toplayacak şekilde yapılandırmak için *Microsoft-Extensions-Logging listesine dizesini ekleyin. Dizenin başındaki * işaretini unutmayın.

Windows Olay Günlüğü

Windows EventLog sağlayıcısı günlük çıkışını Windows Olay Günlüğü'ne gönderir. Diğer sağlayıcılardan farklı olarak EventLog , sağlayıcı varsayılan sağlayıcı dışı ayarları devralmaz. EventLog günlük ayarları belirtilmezse, varsayılan olarak LogLevel.Warning kullanılır.

LogLevel.Warning düzeyinden daha düşük düzeyli olayları günlüğe kaydetmek için günlük düzeyini açıkça ayarlayın. Aşağıdaki örnek Olay Günlüğü varsayılan günlük düzeyini LogLevel.Information olarak ayarlar:

"Logging": {
  "EventLog": {
    "LogLevel": {
      "Default": "Information"
    }
  }
}

AddEventLog aşırı yüklemeleri EventLogSettings sınıfında geçirilebilir. null belirtilirse veya hiç belirtilmezse aşağıdaki varsayılan ayarlar kullanılır:

  • LogName: "Application"
  • SourceName: ".NET Runtime"
  • MachineName: Yerel makine adı kullanılır.

Aşağıdaki kod, SourceName varsayılan değerini "".NET Runtime"" olarak CustomLogs değiştirir.

var builder = WebApplication.CreateBuilder();

builder.Logging.AddEventLog(eventLogSettings =>
{
    eventLogSettings.SourceName = "CustomLogs";
});

Uygulama, AddEventLog aşırı yüklemesini EventLogSettings ile çağırdığında, sağlanan ayarlarla yeni bir EventLogLoggerProvider örneği oluşturulur. Zaten kayıtlı bir EventLogLoggerProvider örnek varsa ve uygulama tüm ClearProviders örnekleri kaldırmak için ILoggerProvider çağrısı yapmazsa, yeni ayarlar mevcut ayarların yerini almaz. EventLogSettings'nin kullanıldığından emin olmak istiyorsanız, ClearProviders çağrısından önce AddEventLog’i çağırın.

Azure App Service

SağlayıcıMicrosoft.Extensions.Logging.AzureAppServices NuGet paketi, günlükleri Azure App Service uygulamasının dosya sistemindeki metin dosyalarına ve azure depolama hesabındaki blob depolamaya yazar. Sağlayıcı, yalnızca proje Azure ortamında çalıştırıldığında günlüğe alır.

Sağlayıcı paketi paylaşılan çerçeveye dahil değildir. Sağlayıcıyı kullanmak için sağlayıcı paketini projeye ekleyin.

Sağlayıcı ayarlarını yapılandırmak için, aşağıdaki örnekte gösterildiği gibi AzureFileLoggerOptions ve AzureBlobLoggerOptions kullanın:

using Microsoft.Extensions.Logging.AzureAppServices;

var builder = WebApplication.CreateBuilder();

builder.Logging.AddAzureWebAppDiagnostics();

builder.Services.Configure<AzureFileLoggerOptions>(options =>
{
    options.FileName = "azure-diagnostics-";
    options.FileSizeLimit = 50 * 1024;
    options.RetainedFileCountLimit = 5;
});

builder.Services.Configure<AzureBlobLoggerOptions>(options =>
{
    options.BlobName = "log.txt";
});
public class Scopes
{
    public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureLogging(logging => logging.AddAzureWebAppDiagnostics())
                .ConfigureServices(serviceCollection => serviceCollection
                    .Configure<AzureFileLoggerOptions>(options =>
                    {
                        options.FileName = "azure-diagnostics-";
                        options.FileSizeLimit = 50 * 1024;
                        options.RetainedFileCountLimit = 5;
                    })
                    .Configure<AzureBlobLoggerOptions>(options =>
                    {
                        options.BlobName = "log.txt";
                    }))
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });
    }
}

Azure App Service'e dağıtıldığında, uygulama bu ayarları Azure portaldaki App Service sayfasının App Service günlükleri bölümünde kullanır. Aşağıdaki ayarlar güncelleştirildiğinde, uygulamanın yeniden başlatılması veya yeniden dağıtılması gerekmeden değişiklikler hemen geçerlilik kazanır.

  • Application Logging (Dosya Sistemi)
  • Uygulama Günlüğü (Blob)

Günlük dosyalarının varsayılan konumudur D:\home\LogFiles\Application. Varsayılan dosya boyutu sınırı 10 MB'tır ve varsayılan en fazla korunan dosya sayısı iki dosyadır.

Azure günlük akışı

Azure günlük akışı, günlük etkinliğini şu konumlardan gerçek zamanlı olarak görüntülemeyi destekler:

  • Uygulama sunucusu
  • Web sunucusu
  • Başarısız istek izlemesi

Azure günlük akışını yapılandırmak için:

  • Uygulamanın portal sayfasından App Service günlükleri sayfasına gidin.
  • Application Logging (Dosya Sistemi) seçeneğini Açık olarak ayarlayın.
  • Günlük Düzeyini seçin. Bu ayar yalnızca Azure günlük akışı için geçerlidir.

Günlükleri görüntülemek için Günlük Akışı sayfasına gidin. Günlüğe kaydedilen iletiler ILogger arabirimiyle günlüğe kaydedilir.

Azure Application Insights

Application Insights, web uygulamasını izleyen ve telemetri verilerini sorgulamak ve analiz etmek için araçlar sağlayan bir hizmettir. Bu sağlayıcıyı kullanıyorsanız Application Insights araçlarını kullanarak günlüklerinizi sorgulayabilir ve analiz edebilirsiniz.

SağlayıcıMicrosoft.Extensions.Logging.ApplicationInsights NuGet paketi günlükleri Azure Application Insights'a yazar. ASP.NET Core için tüm kullanılabilir telemetri verilerini sağlayan NuGet paketininMicrosoft.ApplicationInsights.AspNetCore bir bağımlılığı olarak günlük sağlayıcısı bulunur. NuGet Microsoft.ApplicationInsights.AspNetCore paketini kullanıyorsanız, sağlayıcı Microsoft.Extensions.Logging.ApplicationInsights paketini yüklemeniz gerekmez.

Note

Microsoft.ApplicationInsights.Web NuGet paketi ASP.NET Core değil ASP.NET 4.x içindir ve ASP.NET Core uygulamasında kullanılmamalıdır.

Daha fazla bilgi edinmek için aşağıdaki kaynaklara bakın:

Üçüncü taraf günlük sağlayıcıları

ASP.NET Core ile çalışan üçüncü taraf günlük çerçeveleri:

Bazı üçüncü taraf çerçeveler yapılandırılmış günlük olarak da bilinen anlamsal günlük gerçekleştirebilir.

Üçüncü taraf bir çerçeveyi kullanmak, yerleşik sağlayıcılardan birini kullanmaya benzer:

  1. Sağlayıcının NuGet paketini projeye ekleyin.
  2. Günlük altyapısı tarafından sağlanan bir ILoggerFactory uzantı yöntemi kullanın.

Daha fazla bilgi için sağlayıcının belgelerine bakın. Üçüncü taraf günlük sağlayıcıları Microsoft'a ait değildir, bakımı yapılmaz veya desteklenmez.

Ana bilgisayar içermeyen konsol uygulaması günlüğü

Genel Ana Bilgisayar kullanılmadan bir konsol uygulamasında günlük kaydı oluşturmak için bkz. C# ve .NET'te günlüğe kaydetme. Ek bir örnek için, ASP.NET Core'da barındırılan hizmetler içeren Arka plan görevleri kapsamındaki Arka Plan Görevleriörnek uygulamasına bakın.

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

Günlüğe kaydetme işleminin çok hızlı gerçekleşmesi gerektiğinden zaman uyumsuz kodun performans maliyetine değmez. Günlük veri deposu yavaşsa, doğrudan bu depoya yazmayın. Günlük iletilerini başlangıçta hızlı bir depoya yazmayı ve ardından günlükleri daha sonra daha yavaş veri deposuna taşımayı göz önünde bulundurun. Örneğin, yöntemler eşzamanlı olduğundan, günlük iletilerini doğrudan bir Log yöntemi içinde SQL Server veri deposuna yazmayın. Bunun yerine, günlük iletilerini zaman uyumlu bir şekilde bellek içi kuyruğa ekleyin ve arka plan çalışanının verileri SQL Server'a zaman uyumsuz olarak göndermek için iletileri kuyruktan çekmesini sağlayın. Daha fazla bilgi için bkz. Yavaş veri depoları için günlüğü ileti kuyruğuna kaydetme rehberi (dotnet/AspNetCore.Docs #11801).

Kodda günlük filtresi kurallarını uygulama

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

Aşağıdaki örnek, AddFilter çağrısı WebApplicationBuilder.Logging ile filtre kurallarının kodda nasıl kaydedileceğini göstermektedir.

using Microsoft.Extensions.Logging.Console;
using Microsoft.Extensions.Logging.Debug;

var builder = WebApplication.CreateBuilder();

builder.Logging.AddFilter("System", LogLevel.Debug);
builder.Logging.AddFilter<DebugLoggerProvider>("Microsoft", LogLevel.Information);
builder.Logging.AddFilter<ConsoleLoggerProvider>("Microsoft", LogLevel.Trace);

Yukarıdaki örnekte:

  • İlk filtre aşağıdakileri belirtir:

    • Tüm sağlayıcılar için günlük filtreleme kuralları çünkü belirli bir sağlayıcı yapılandırılmadı.
    • "System" ile başlayan tüm kategoriler.
    • Debug ve daha yüksek günlük düzeyi.
  • SağlayıcıDebug (DebugLoggerProvider) aşağıdakileri belirtir:

    • "Microsoft" ile başlayan tüm kategoriler.
    • Information ve daha yüksek günlük düzeyi.
  • SağlayıcıConsole (ConsoleLoggerProvider) aşağıdakileri belirtir:

    • "Microsoft" ile başlayan tüm kategoriler.
    • Trace ve daha yüksek günlük düzeyi.

Günlükleme [loglama] kapsamları için izleme bağlamını belirtin

Günlük kitaplıkları örtük olarak ile ActivityTrackingOptionsbir kapsam nesnesi oluşturur. Seçenekleri gösteren alanlar (ActivityTrackingOptions) şunlardır:

  • SpanId
  • TraceId
  • ParentId
  • Baggage
  • Tags

SpanId, TraceId, ParentId varsayılan olarak etkinleştirilmiştir.

Aşağıdaki örnekte, yalnızca SpanId ve TraceId belirtilir:

var builder = WebApplication.CreateBuilder(args);

builder.Logging.AddSimpleConsole(options =>
{
    options.IncludeScopes = true;
});

builder.Logging.Configure(options =>
{
    options.ActivityTrackingOptions = 
        ActivityTrackingOptions.SpanId | ActivityTrackingOptions.TraceId;
});

var app = builder.Build();

app.MapGet("/", () => "Hello World!");

app.Run();

Kapsamı SpanId, TraceId ve ParentId ile otomatik olarak günlüğe kaydet

Günlük kitaplıkları SpanId, TraceId ve ParentId ile örtük olarak bir kapsam nesnesi oluşturur. Bu davranış ActivityTrackingOptions yoluyla yapılandırılır.

Günlük kitaplıkları örtük olarak ile ActivityTrackingOptionsbir kapsam nesnesi oluşturur. Seçenekleri gösteren alanlar (ActivityTrackingOptions) şunlardır:

  • SpanId
  • TraceId
  • ParentId

SpanId, TraceId, ParentId varsayılan olarak etkinleştirilmiştir.

Aşağıdaki örnekte, yalnızca SpanId ve TraceId belirtilir:

var loggerFactory = LoggerFactory.Create(logging =>
{
    logging.Configure(options =>
    {
        options.ActivityTrackingOptions = 
            ActivityTrackingOptions.SpanId | ActivityTrackingOptions.TraceId;
    }).AddSimpleConsole(options =>
    {
        options.IncludeScopes = true;
    });
});

W3C İzleme Bağlamı belirtimitraceparent http isteği üst bilgisi ayarlandıysa:

  • ParentId günlük kapsamındaki öğe, gelen parent-id üst bilgisinden traceparent öğesini gösterir.
  • SpanId günlük kapsamındaki, sonraki dışa yönelik adım/span için güncellenmiş parent-id değerini gösterir.

Daha fazla bilgi için bkz. traceparent alanını değiştirme.

Özel günlükçü oluşturma

Özel günlükçü oluşturmak için bkz. .NET'te özel günlük sağlayıcısı uygulama.

Konak oluşturma sırasında günlüğe kaydetme

Konak oluşturma sırasında günlüğe kaydetme işlemi doğrudan desteklenmez. Öte yandan ayrı bir günlükçü kullanılabilir. Aşağıdaki örnekte 'da günlüğe kaydetmek için CreateHostBuilder günlükçüsü kullanılır. 'de belirtilen ve Serilog NuGet package tarafından sağlanan statik yapılandırmayı kullanır.

Uygulamanın CreateHostBuilder dosyasındaki Program metodunda:

var builtConfig = new ConfigurationBuilder()
    .AddJsonFile("appsettings.json")
    .AddCommandLine(args)
    .Build();

Log.Logger = new LoggerConfiguration()
    .WriteTo.Console()
    .WriteTo.File(builtConfig["Logging:FilePath"])
    .CreateLogger();

try
{
    return Host.CreateDefaultBuilder(args)
        .ConfigureServices((context, services) =>
        {
            services.AddRazorPages();
        })
        .ConfigureAppConfiguration((hostingContext, config) =>
        {
            config.AddConfiguration(builtConfig);
        })
        .ConfigureLogging(logging =>
        {   
            logging.AddSerilog();
        })
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup<Startup>();
        });
}
catch (Exception ex)
{
    Log.Fatal(ex, "Host builder error");

    throw;
}
finally
{
    Log.CloseAndFlush();
}

Bağlı olduğu bir hizmeti yapılandırma ILogger

ASP.NET Core'un önceki sürümlerinde, bir günlükçünün Startup içerisine oluşturucu enjeksiyonu, Web Host için ayrı bir DI kapsayıcısı oluşturulduğundan çalışır. Generic Host için neden yalnızca bir kapsayıcı oluşturulduğu hakkında bilgi için önemli değişiklik duyurusuna bakın.

ILogger bağımlılığı olan bir hizmet yapılandırmak için oluşturucu eklemeyi kullanın veya bir fabrika yöntemi sağlayın. Fabrika yöntemi yaklaşımı yalnızca başka seçenek yoksa önerilir. Örneğin, bağımlılık enjeksiyonu (DI) tarafından sağlanan bir kayıt tutucuya ihtiyaç duyan bir hizmeti göz önünde bulundurun.

services.AddSingleton<ILoggingService>((container) =>
{
    var logger = container.GetRequiredService<ILogger<LoggingService>>();
    return new LoggingService() { Logger = logger };
});

İlk kez DI kapsayıcısı tarafından bir Func<T,TResult> örneği oluşturulduğunda çalışan bir LoggerService kodudur. Bu düzeni kullanarak tüm kayıtlı hizmetlere erişin.

Hata raporlarını kayıt altına alma

GitHub deposunda yer alan sorunlar bölümüne bir günlük hata raporu dotnet/runtime dosyalayın.

Ortak günlük kategorileri

Bu bölümde, ASP.NET Core uygulama günlüklerinde görülen yaygın günlük kategorileri açıklanmaktadır. Aşağıdakiler kapsamlı bir liste değildir.

Microsoft.AspNetCore: Barındırma, yönlendirme ve ara yazılım gibi ASP.NET Core çerçeve bileşenlerinden günlükler.

Authentication

  • Microsoft.AspNetCore.Authentication: Kimlik doğrulama düzeni işlemesi de dahil olmak üzere kimlik doğrulama ara yazılımı ve hizmetlerinden alınan günlükler.
  • Microsoft.AspNetCore.Authentication.Cookies: cookie tabanlı kimlik doğrulamasına özgü günlükler.
  • Microsoft.AspNetCore.Authentication.JwtBearer: JWT Taşıyıcı Belirteci kimlik doğrulamasıyla ilgili günlükler.
  • Microsoft.AspNetCore.Authentication.OpenIdConnect: OpenID Connect kimlik doğrulama işlemleriyle ilgili günlükler.
  • Microsoft.AspNetCore.Authentication.OAuth: OAuth kimlik doğrulaması ve yetkilendirme akışlarıyla ilgili günlükler.

Authorization

  • Microsoft.AspNetCore.Authorization: İlke değerlendirmesi ve karar alma dahil olmak üzere yetkilendirme işlemleriyle ilgili günlükler.
  • Microsoft.AspNetCore.Authorization.DefaultAuthorizationService: Varsayılan hakkında loglar.

Konfigürasyon

  • Microsoft.Extensions.Configuration.Json: JSON dosyalarından yapılandırma verileri edinen sınıflardan günlükler.
  • Microsoft.Extensions.Configuration.UserSecrets: Kullanıcı sırları yapılandırma verilerini yüklemeyle ilgili günlükler.

Kaynaklar Arası Paylaşım (CORS)

  • Microsoft.AspNetCore.Cors: Cross-Origin Resource Sharing (CORS) ara yazılımı ve ilke değerlendirmesiyle ilgili loglar.
  • Microsoft.AspNetCore.Cors.Infrastructure: CORS politika yapılandırması ve uygulaması ile ilgili günlükler.

Veri Koruması:

  • Microsoft.AspNetCore.DataProtection: Anahtar yönetimi, şifreleme işlemleri ve hangi anahtarların değerlendirildiği, bulunduğu ve kullanıldığı dahil olmak üzere veri koruma sisteminden günlükler.
  • Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager: Anahtar depolama ve alma dahil olmak üzere XML anahtar yöneticisine özgü günlükler.

Diagnostics

  • Microsoft.AspNetCore.Diagnostics: Özel durum işleme ve durum kodu sayfaları da dahil olmak üzere tanılama ve hata işleme ara yazılımı hakkındaki günlükler.
  • Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware: Geliştirici özel durum sayfası ara yazılım işlemeye özgü günlükler.
  • Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware: Özel durum işleme ve hata yanıtı oluşturma ile ilgili günlükler.
  • Microsoft.AspNetCore.Diagnostics.StatusCodePageMiddleware: Durum kodu sayfası ara yazılımı ve yanıt işleme ile ilgili günlükler.

Konak Filtreleme

  • Microsoft.AspNetCore.HostFiltering: Konak filtreleme ara yazılımı tarafından izin verilen ve reddedilen konaklar.
  • Microsoft.AspNetCore.HostFiltering.HostFilteringMiddleware: İzin verilen ve reddedilen konaklar dahil olmak üzere konak filtreleme ara yazılımına ilişkin günlükler.
  • Microsoft.AspNetCore.HostFiltering.HostFilteringOptions: HostFiltering ara yazılımının seçenekleriyle ilgili günlükler.

Barındırma

  • Microsoft.AspNetCore.Hosting.Lifetime: Web ana bilgisayarının yaşam döngüsüyle ilgili, başlatma ve durdurma olaylarını içeren günlükler.
  • Microsoft.AspNetCore.Hosting.Diagnostics: Uygulama başlatma ve kapatma gibi tanılama bilgilerini günlüğe kaydeder.
  • Microsoft.AspNetCore.Hosting.RequestDelegate: HTTP isteklerinin uygulama işlem hattı tarafından işlenmesiyle ilgili günlükler.
  • Microsoft.AspNetCore.Hosting.Internal.WebHost: Web barındırıcısından gelen iç günlükler, barındırıcıyla ilgili sorunları gidermek için faydalıdır.
  • Microsoft.AspNetCore.Hosting.Internal.HostedServiceExecutor: Web konağı tarafından barındırılan hizmetlerin yürütülmesiyle ilgili günlükler.

HTTP

  • Microsoft.AspNetCore.Http.ConnectionLogging: Bağlantı kurma ve sonlandırma da dahil olmak üzere HTTP bağlantıları ile ilgili.
  • Microsoft.AspNetCore.Http.DefaultHttpContext: HttpContext örneklerinin oluşturulması ve kullanımıyla ilgili günlükler.
  • Microsoft.AspNetCore.Http.Endpoints.EndpointMiddleware: Uç nokta yönlendirme ve ara yazılım yürütme hakkında günlükler.
  • Microsoft.AspNetCore.Http.Response: HTTP yanıt işlemeyle ilgili günlükler.

HTTPS

  • Microsoft.AspNetCore.HttpsPolicy: HTTPS yeniden yönlendirme ara yazılımı, politika uygulama ve HTTP Strict-Transport-Security (HSTS) günlükleri.
  • Microsoft.AspNetCore.HttpsPolicy.HstsMiddleware: HTTP Strict-Transport-Security (HSTS) orta katman yazılımı işlemine özgü günlükler.
  • Microsoft.AspNetCore.HttpsPolicy.HttpsRedirectionMiddleware: HTTPS yeniden yönlendirme ara yazılım yürütmesi ile ilgili günlükler.
  • Microsoft.AspNetCore.HttpsPolicy.HstsOptions: HSTS ilke yapılandırması ve zorlaması ile ilgili günlükler.

Identity

  • Microsoft.AspNetCore.Identity: kullanıcı yönetimi ve kimlik işlemleri dahil olmak üzere ASP.NET Core Identity çerçevesindeki günlükler.
  • Microsoft.AspNetCore.Identity.RoleManager: Rol yönetimi işlemleriyle ilgili günlükler.
  • Microsoft.AspNetCore.Identity.UserManager: Kullanıcı yönetimi etkinlikleri ve yaşam döngüsü olaylarıyla ilgili günlükler.

Kestrel

  • Microsoft.AspNetCore.Server.Kestrel: Bağlantı işleme ve istek işlemeyi kapsayan Kestrel web sunucusundan günlükler.
  • Microsoft.AspNetCore.Server.Kestrel.Core: Yapılandırma ve kaynak yönetimi gibi temel Kestrel işlemler ile ilgili günlükler.
  • Microsoft.AspNetCore.Server.Kestrel.Transport: tarafından Kestrelkullanılan ağ aktarım katmanlarına özgü günlükler.

Ağaç kesimi

  • Microsoft.Extensions.Logging: Günlük kaydı uzantıları API'sinden kayıtlar.
  • Microsoft.Extensions.Logging.Console: Konsol günlükçüsüne özgü günlükler.

MVC

  • Microsoft.AspNetCore.Mvc: Denetleyici ve eylem yürütme dahil olmak üzere MVC çerçeve bileşenlerinden genel günlükler.
  • Microsoft.AspNetCore.Mvc.Infrastructure: MVC için model bağlama ve eylem filtreleri gibi altyapı ve destek hizmetleriyle ilgili günlükler.
  • Microsoft.AspNetCore.Mvc.ModelBinding: Model bağlama işlemleri ve veri doğrulama ile ilgili günlükler.
  • Microsoft.AspNetCore.Mvc.Filters: Eylem filtrelerinin ve filtre işlem hatlarının yürütülmesiyle ilgili günlükler.
  • Microsoft.AspNetCore.Mvc.Razor: Razor'ye özgü, görüntü işleme ve derleme günlükleri.
  • Microsoft.AspNetCore.Mvc.ViewFeatures: Görünüm işlemeyle ilgili günlükler ve görünüm bileşenleri ve etiket yardımcıları gibi ilgili özellikler.

Routing

  • Microsoft.AspNetCore.Routing.EndpointMiddleware: HTTP isteklerinin uç noktalara yönlendirilmesiyle ilgili günlükler.
  • Microsoft.AspNetCore.Routing.EndpointRoutingMiddleware: Uç nokta yönlendirme ara yazılım isteklerin işlenmesini kaydeder.
  • Microsoft.AspNetCore.Routing.Matching.DataSourceDependentMatcher: Yol eşleştirme ve uç noktaların seçimiyle ilgili günlükler.
  • Microsoft.AspNetCore.Routing.Matching.DfaMatcher: DFA (Deterministic Finite Automaton) yönlendirme eşleştiricisine özgü günlükler.

SignalR

  • Microsoft.AspNetCore.SignalR: Hub bağlantıları ve ileti işleme dahil olmak üzere çerçevedeki SignalR günlükler.
  • Microsoft.AspNetCore.SignalR.Hub: Hub çağrısına ve ileti göndermeye özgü günlükler.
  • Microsoft.AspNetCore.SignalR.Transports: SignalR tarafından kullanılan taşıma mekanizmalarıyla ilgili günlükler.

Statik dosyalar

  • Microsoft.AspNetCore.StaticFiles: Dosya sunma ve önbellek işlemleri de dahil olmak üzere statik dosyalar ara yazılımından günlükler.
  • Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware: Statik dosya ara yazılımı yürütme ve dosya yanıtı işleme ile ilgili günlükler.

Ek kaynaklar