Aracılığıyla paylaş


ASP.NET Core Blazor günlüğü

Not

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

Uyarı

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 8 sürümüne bakın.

Önemli

Bu bilgiler, ticari olarak piyasaya sürülmeden önce önemli ölçüde değiştirilebilen bir yayın öncesi ürünle ilgilidir. Burada verilen bilgilerle ilgili olarak Microsoft açık veya zımni hiçbir garanti vermez.

Geçerli sürüm için bu makalenin .NET 9 sürümüne bakın.

Bu makalede, yapılandırma ve bileşenlerden Razor günlük iletileri yazma da dahil olmak üzere uygulama günlüğü açıklanmaktadırBlazor.

Yapılandırma

Günlük yapılandırması, uygulama ayarları dosyalarından yüklenebilir. Daha fazla bilgi için bkz . ASP.NET Core Blazor yapılandırması.

Varsayılan günlük düzeylerinde ve ek günlük sağlayıcıları yapılandırılmadan:

Uygulama proje dosyasında örtük ad alanlarını ()<ImplicitUsings>enable</ImplicitUsings> kullanacak şekilde yapılandırıldığında, Visual Studio IntelliSense API'sinin tamamlanmasını veya uygulama derlemesini desteklemek için sınıfındaki LoggerExtensions herhangi bir API için Microsoft.Extensions.Logging yönerge using gerekmez. Örtük ad alanları etkin değilse, Razor bileşenler dosya aracılığıyla içeri aktarılmaz ad alanlarını günlüğe kaydetme yönergelerini _Imports.razor açıkça tanımlamalıdır@using.

Günlük düzeyleri

Günlük düzeyleri, konumundaki API belgelerinde LogLevellistelenen ASP.NET Core uygulama günlüğü düzeylerine uygundur.

Razor bileşen günlüğü

ve gibi LogErrorLogWarning API'ler using için IntelliSense tamamlamalarını desteklemek için için yönergesi Microsoft.Extensions.Logging gereklidir.

Aşağıdaki örnek:

  • Günlükçü oluşturmak için bir ILogger (ILogger<Counter1>) nesnesi ekler. Günlüğün kategorisi, bileşenin türünün tam adıdır. Counter
  • Warning düzeyinde günlüğe kaydetmek için LogWarning yöntemini çağırır.

Counter1.razor:

@page "/counter-1"
@inject ILogger<Counter1> Logger

<PageTitle>Counter 1</PageTitle>

<h1>Counter 1</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.LogWarning("Someone has clicked me!");

        currentCount++;
    }
}
@page "/counter-1"
@inject ILogger<Counter1> Logger

<PageTitle>Counter 1</PageTitle>

<h1>Counter 1</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.LogWarning("Someone has clicked me!");

        currentCount++;
    }
}
@page "/counter-1"
@inject ILogger<Counter1> 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.LogWarning("Someone has clicked me!");

        currentCount++;
    }
}
@page "/counter-1"
@inject ILogger<Counter1> 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.LogWarning("Someone has clicked me!");

        currentCount++;
    }
}
@page "/counter-1"
@using Microsoft.Extensions.Logging
@inject ILogger<Counter1> 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.LogWarning("Someone has clicked me!");

        currentCount++;
    }
}
@page "/counter-1"
@using Microsoft.Extensions.Logging
@inject ILogger<Counter1> 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.LogWarning("Someone has clicked me!");

        currentCount++;
    }
}

Aşağıdaki örnekte, bir in bileşenleriyle ILoggerFactory günlüğe kaydetme işlemi gösterilmektedir.

Counter2.razor:

@page "/counter-2"
@inject ILoggerFactory LoggerFactory

<PageTitle>Counter 2</PageTitle>

<h1>Counter 2</h1>

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

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

@code {
    private int currentCount = 0;

    private void IncrementCount()
    {
        var logger = LoggerFactory.CreateLogger<Counter2>();
        logger.LogWarning("Someone has clicked me!");

        currentCount++;
    }
}
@page "/counter-2"
@inject ILoggerFactory LoggerFactory

<PageTitle>Counter 2</PageTitle>

<h1>Counter 2</h1>

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

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

@code {
    private int currentCount = 0;

    private void IncrementCount()
    {
        var logger = LoggerFactory.CreateLogger<Counter2>();
        logger.LogWarning("Someone has clicked me!");

        currentCount++;
    }
}
@page "/counter-2"
@inject ILoggerFactory LoggerFactory

<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()
    {
        var logger = LoggerFactory.CreateLogger<Counter2>();
        logger.LogWarning("Someone has clicked me!");

        currentCount++;
    }
}
@page "/counter-2"
@inject ILoggerFactory LoggerFactory

<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()
    {
        var logger = LoggerFactory.CreateLogger<Counter2>();
        logger.LogWarning("Someone has clicked me!");

        currentCount++;
    }
}
@page "/counter-2"
@using Microsoft.Extensions.Logging
@inject ILoggerFactory LoggerFactory

<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()
    {
        var logger = LoggerFactory.CreateLogger<Counter2>();
        logger.LogWarning("Someone has clicked me!");

        currentCount++;
    }
}
@page "/counter-2"
@using Microsoft.Extensions.Logging
@inject ILoggerFactory LoggerFactory

<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()
    {
        var logger = LoggerFactory.CreateLogger<Counter2>();
        logger.LogWarning("Someone has clicked me!");

        currentCount++;
    }
}

Sunucu tarafı günlüğü

Genel ASP.NET Core günlüğü kılavuzu için bkz . .NET Core ve ASP.NET Core'da günlüğe kaydetme.

İstemci tarafı günlüğü

ASP.NET Core günlüğünün her özelliği istemci tarafında desteklenmez. Örneğin, istemci tarafı bileşenlerinin istemcinin dosya sistemine veya ağına erişimi yoktur, bu nedenle günlükleri istemcinin fiziksel veya ağ depolama alanına yazmak mümkün değildir. Tek sayfalı uygulamalarla (SPA' lar) çalışmak üzere tasarlanmış bir üçüncü taraf günlük hizmeti kullanırken hizmetin güvenlik kılavuzunu izleyin. Anahtarlar veya gizli diziler de dahil olmak üzere istemci tarafında depolanan her veri parçasının güvenli olmadığını ve kötü amaçlı kullanıcılar tarafından kolayca bulunabileceğini unutmayın.

Çerçeve sürümüne ve günlüğe kaydetme özelliklerine bağlı olarak, günlük uygulamaları için Microsoft.Extensions.Logging ad alanının dosyaya Program eklenmesi gerekebilir:

using Microsoft.Extensions.Logging;

özelliğiyle istemci tarafı uygulamalarında günlüğe kaydetmeyi WebAssemblyHostBuilder.Logging yapılandırın. Logging özelliği türünde ILoggingBuilderolduğundan uzantı yöntemleri ILoggingBuilder desteklenir.

En düşük günlük düzeyini ayarlamak için ile dosyasındaki konak oluşturucusunu Program çağırın.LoggingBuilderExtensions.SetMinimumLevel LogLevel Aşağıdaki örnek en düşük günlük düzeyini olarak Warningayarlar:

builder.Logging.SetMinimumLevel(LogLevel.Warning);

İstemci tarafı Program dosyasında oturum açma

Günlüğe kaydetme, çerçevenin WebAssemblyHostBuilder iç konsol günlükçü sağlayıcısı (WebAssemblyConsoleLoggerProvider (başvuru kaynağı)) kullanılarak oluşturulduktan sonra istemci tarafı uygulamalarında desteklenir.

Program dosyasında:

var host = builder.Build();

var logger = host.Services.GetRequiredService<ILoggerFactory>()
    .CreateLogger<Program>();

logger.LogInformation("Logged after the app is built in the Program file.");

await host.RunAsync();

konsol çıkışını Geliştirici araçları:

info: Program[0]
Logged after the app is built in the Program file.

Not

.NET başvuru kaynağına yönelik belge bağlantıları genellikle deponun varsayılan dalını yükler ve bu dal .NET'in sonraki sürümü için geçerli geliştirmeyi temsil eder. Belirli bir sürümün etiketini seçmek için Dalları veya etiketleri değiştir açılan listesini kullanın. Daha fazla bilgi için bkz. ASP.NET Core kaynak kodunun sürüm etiketini seçme (dotnet/AspNetCore.Docs #26205).

İstemci tarafı günlük kategorisi

Günlük kategorileri desteklenir.

Aşağıdaki örnekte, proje şablonundan Blazor oluşturulan bir uygulamanın bileşeniyle Counter günlük kategorilerinin nasıl kullanılacağı gösterilmektedir.

IncrementCount Olarak bir ILoggerFactory LoggerFactoryekleyen uygulamanın Counter bileşeni (Counter.razor) yönteminde:

var logger = LoggerFactory.CreateLogger("CustomCategory");
logger.LogWarning("Someone has clicked me!");

konsol çıkışını Geliştirici araçları:

warn: CustomCategory[0]
Someone has clicked me!

İstemci tarafı günlük olay kimliği

Günlük olay kimliği desteklenir.

Aşağıdaki örnekte, proje şablonundan Blazor oluşturulan bir uygulamanın bileşeniyle Counter günlük olayı kimliklerinin nasıl kullanılacağı gösterilmektedir.

LogEvent.cs:

public class LogEvent
{
    public const int Event1 = 1000;
    public const int Event2 = 1001;
}

IncrementCount Uygulamanın Counter bileşeni yönteminde (Counter.razor):

logger.LogInformation(LogEvent.Event1, "Someone has clicked me!");
logger.LogWarning(LogEvent.Event2, "Someone has clicked me!");

konsol çıkışını Geliştirici araçları:

info: BlazorSample.Pages.Counter[1000]
Someone has clicked me!
warn: BlazorSample.Pages.Counter[1001]
Someone has clicked me!

İstemci tarafı günlük iletisi şablonu

Günlük iletisi şablonları desteklenir:

Aşağıdaki örnekte, proje şablonundan Blazor oluşturulan bir uygulamanın bileşeniyle Counter günlük iletisi şablonlarının nasıl kullanılacağı gösterilmektedir.

IncrementCount Uygulamanın Counter bileşeni yönteminde (Counter.razor):

logger.LogInformation("Someone clicked me at {CurrentDT}!", DateTime.UtcNow);

konsol çıkışını Geliştirici araçları:

info: BlazorSample.Pages.Counter[0]
Someone clicked me at 04/21/2022 12:15:57!

İstemci tarafı günlük özel durum parametreleri

Günlük özel durum parametreleri desteklenir.

Aşağıdaki örnekte, proje şablonundan Blazor oluşturulan bir uygulamanın bileşeniyle Counter günlük özel durum parametrelerinin nasıl kullanılacağı gösterilmektedir.

IncrementCount Uygulamanın Counter bileşeni yönteminde (Counter.razor):

currentCount++;

try
{
    if (currentCount == 3)
    {
        currentCount = 4;
        throw new OperationCanceledException("Skip 3");
    }
}
catch (Exception ex)
{
    logger.LogWarning(ex, "Exception (currentCount: {Count})!", currentCount);
}

konsol çıkışını Geliştirici araçları:

warn: BlazorSample.Pages.Counter[0]
Exception (currentCount: 4)!
System.OperationCanceledException: Skip 3
at BlazorSample.Pages.Counter.IncrementCount() in C:UsersAlabaDesktopBlazorSamplePagesCounter.razor:line 28

İstemci tarafı filtre işlevi

Filtre işlevleri desteklenir.

Aşağıdaki örnekte, proje şablonundan Blazor oluşturulan bir uygulamanın bileşeniyle Counter bir filtrenin nasıl kullanılacağı gösterilmektedir.

Program dosyasında:

builder.Logging.AddFilter((provider, category, logLevel) =>
    category.Equals("CustomCategory2") && logLevel == LogLevel.Information);

IncrementCount Olarak bir ILoggerFactory LoggerFactoryekleyen uygulamanın Counter bileşeni (Counter.razor) yönteminde:

var logger1 = LoggerFactory.CreateLogger("CustomCategory1");
logger1.LogInformation("Someone has clicked me!");

var logger2 = LoggerFactory.CreateLogger("CustomCategory1");
logger2.LogWarning("Someone has clicked me!");

var logger3 = LoggerFactory.CreateLogger("CustomCategory2");
logger3.LogInformation("Someone has clicked me!");

var logger4 = LoggerFactory.CreateLogger("CustomCategory2");
logger4.LogWarning("Someone has clicked me!");

Geliştirici araçları konsol çıkışında filtre yalnızca kategori ve Information günlük düzeyi iletisi için günlüğe kaydetmeye CustomCategory2 izin verir:

info: CustomCategory2[0]
Someone has clicked me!

Uygulama ayrıca belirli ad alanları için günlük filtrelemeyi yapılandırabilir. Örneğin, günlük düzeyini Trace dosyasında olarak Program ayarlayın:

builder.Logging.SetMinimumLevel(LogLevel.Trace);

Normalde Trace günlük düzeyinde Ayrıntılı düzeydeki geliştirici araçları konsol çıkışı aşağıdaki gibi günlük iletilerini içerirMicrosoft.AspNetCore.Components.RenderTree:

dbug: Microsoft.AspNetCore.Components.RenderTree.Renderer[3]
Rendering component 14 of type Microsoft.AspNetCore.Components.Web.HeadOutlet

dosyadaProgram, aşağıdaki yaklaşımlardan biri kullanılarak belirli Microsoft.AspNetCore.Components.RenderTree günlük iletileri devre dışı bırakılabilir:

  • builder.Logging.AddFilter("Microsoft.AspNetCore.Components.RenderTree.*", LogLevel.None);
    
  • builder.Services.PostConfigure<LoggerFilterOptions>(options =>
        options.Rules.Add(
            new LoggerFilterRule(null, 
                                 "Microsoft.AspNetCore.Components.RenderTree.*", 
                                 LogLevel.None, 
                                 null)
        ));
    

Yukarıdaki filtrelerden biri uygulamaya eklendikten sonra Ayrıntılı düzeydeki konsol çıkışı API'den Microsoft.AspNetCore.Components.RenderTree gelen günlük iletilerini göstermez.

İstemci tarafı özel günlükçü sağlayıcısı

Bu bölümdeki örnekte, daha fazla özelleştirme için özel bir günlükçü sağlayıcısı gösterilmektedir.

Paket için Microsoft.Extensions.Logging.Configuration uygulamaya bir paket başvurusu ekleyin.

Not

.NET uygulamalarına paket ekleme hakkında yönergeler için, Paket tüketimi iş akışında (NuGet belgeleri) paketleri yüklemek ve yönetmek altındaki makalelere bakın. NuGet.org'da doğru paket sürümlerini onaylayın.

Aşağıdaki özel günlükçü yapılandırmasını ekleyin. Yapılandırma, üç günlük düzeyi için özel bir günlük biçimi ayarlayan bir sözlük oluşturur LogLevels : Information, Warning, ve Error. A LogFormat enum, kısa () ve uzun (LogFormat.ShortLogFormat.Long) biçimleri tanımlamak için kullanılır.

CustomLoggerConfiguration.cs:

using Microsoft.Extensions.Logging;

public class CustomLoggerConfiguration
{
    public int EventId { get; set; }

    public Dictionary<LogLevel, LogFormat> LogLevels { get; set; } = 
        new()
        {
            [LogLevel.Information] = LogFormat.Short,
            [LogLevel.Warning] = LogFormat.Short,
            [LogLevel.Error] = LogFormat.Long
        };

    public enum LogFormat
    {
        Short,
        Long
    }
}

Aşağıdaki özel günlükçü'leri uygulamaya ekleyin. Özel CustomLogger günlük biçimleri, önceki CustomLoggerConfiguration yapılandırmada tanımlanan değerlere göre logLevel çıkar.

using Microsoft.Extensions.Logging;
using static CustomLoggerConfiguration;

public sealed class CustomLogger : ILogger
{
    private readonly string name;
    private readonly Func<CustomLoggerConfiguration> getCurrentConfig;

    public CustomLogger(
        string name,
        Func<CustomLoggerConfiguration> getCurrentConfig) =>
        (this.name, this.getCurrentConfig) = (name, getCurrentConfig);

    public IDisposable BeginScope<TState>(TState state) => default!;

    public bool IsEnabled(LogLevel logLevel) =>
        getCurrentConfig().LogLevels.ContainsKey(logLevel);

    public void Log<TState>(
        LogLevel logLevel,
        EventId eventId,
        TState state,
        Exception? exception,
        Func<TState, Exception?, string> formatter)
    {
        if (!IsEnabled(logLevel))
        {
            return;
        }

        CustomLoggerConfiguration config = getCurrentConfig();

        if (config.EventId == 0 || config.EventId == eventId.Id)
        {
            switch (config.LogLevels[logLevel])
            {
                case LogFormat.Short:
                    Console.WriteLine($"{name}: {formatter(state, exception)}");
                    break;
                case LogFormat.Long:
                    Console.WriteLine($"[{eventId.Id, 2}: {logLevel, -12}] {name} - {formatter(state, exception)}");
                    break;
                default:
                    // No-op
                    break;
            }
        }
    }
}

Aşağıdaki özel günlükçü sağlayıcısını uygulamaya ekleyin. CustomLoggerProvider yerleşik günlük yapılandırma özellikleri aracılığıyla günlükçü yapılandırmak için tabanlı bir Optionsyaklaşım benimser. Örneğin, uygulama bu bölümün sonunda gösterilen özel günlükçüde kod değişikliğine gerek kalmadan bir appsettings.json dosya aracılığıyla günlük biçimlerini ayarlayabilir veya değiştirebilir.

CustomLoggerProvider.cs:

using System.Collections.Concurrent;
using Microsoft.Extensions.Options;

[ProviderAlias("CustomLog")]
public sealed class CustomLoggerProvider : ILoggerProvider
{
    private readonly IDisposable onChangeToken;
    private CustomLoggerConfiguration config;
    private readonly ConcurrentDictionary<string, CustomLogger> loggers =
        new(StringComparer.OrdinalIgnoreCase);

    public CustomLoggerProvider(
        IOptionsMonitor<CustomLoggerConfiguration> config)
    {
        this.config = config.CurrentValue;
        onChangeToken = config.OnChange(updatedConfig => this.config = updatedConfig);
    }

    public ILogger CreateLogger(string categoryName) =>
        loggers.GetOrAdd(categoryName, name => new CustomLogger(name, GetCurrentConfig));

    private CustomLoggerConfiguration GetCurrentConfig() => config;

    public void Dispose()
    {
        loggers.Clear();
        onChangeToken.Dispose();
    }
}

Aşağıdaki özel günlükçü uzantılarını ekleyin.

CustomLoggerExtensions.cs:

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Configuration;

public static class CustomLoggerExtensions
{
    public static ILoggingBuilder AddCustomLogger(
        this ILoggingBuilder builder)
    {
        builder.AddConfiguration();

        builder.Services.TryAddEnumerable(
            ServiceDescriptor.Singleton<ILoggerProvider, CustomLoggerProvider>());

        LoggerProviderOptions.RegisterProviderOptions
            <CustomLoggerConfiguration, CustomLoggerProvider>(builder.Services);

        return builder;
    }
}

Konak oluşturucudaki Program dosyada, özel günlük sağlayıcısını çağırarak ClearProviders mevcut sağlayıcıyı temizleyin ve ekleyin:

builder.Logging.ClearProviders().AddCustomLogger();

Aşağıdaki CustomLoggerExample bileşeninde:

  • Hata ayıklama iletisi günlüğe kaydedilmedi.
  • Bilgi iletisi kısa biçimde (LogFormat.Short) günlüğe kaydedilir.
  • Uyarı iletisi kısa biçimde (LogFormat.Short) günlüğe kaydedilir.
  • Hata iletisi uzun biçimde (LogFormat.Long) günlüğe kaydedilir.
  • İzleme iletisi günlüğe kaydedilmez.

CustomLoggerExample.razor:

@page "/custom-logger-example"
@inject ILogger<CustomLoggerExample> Logger

<p>
    <button @onclick="LogMessages">Log Messages</button>
</p>

@code{
    private void LogMessages()
    {
        Logger.LogDebug(1, "This is a debug message.");
        Logger.LogInformation(3, "This is an information message.");
        Logger.LogWarning(5, "This is a warning message.");
        Logger.LogError(7, "This is an error message.");
        Logger.LogTrace(5!, "This is a trace message.");
    }
}
@page "/custom-logger-example"
@using Microsoft.Extensions.Logging
@inject ILogger<CustomLoggerExample> Logger

<p>
    <button @onclick="LogMessages">Log Messages</button>
</p>

@code{
    private void LogMessages()
    {
        Logger.LogDebug(1, "This is a debug message.");
        Logger.LogInformation(3, "This is an information message.");
        Logger.LogWarning(5, "This is a warning message.");
        Logger.LogError(7, "This is an error message.");
        Logger.LogTrace(5!, "This is a trace message.");
    }
}

Düğme seçildiğinde tarayıcının geliştirici araçları konsolunda Log Messages aşağıdaki çıkış görülür. Günlük girdileri, özel günlükçü tarafından uygulanan uygun biçimleri yansıtır (istemci uygulaması olarak adlandırılır LoggingTest):

LoggingTest.Pages.CustomLoggerExample: This is an information message.
LoggingTest.Pages.CustomLoggerExample: This is a warning message.
[ 7: Error ] LoggingTest.Pages.CustomLoggerExample - This is an error message.

Yukarıdaki örnekte yapılan gündelik incelemeden günlük satırı biçimlerini içinde sözlüğü CustomLoggerConfiguration aracılığıyla ayarlamanın kesinlikle gerekli olmadığı açıkça görülüyor. Özel günlükçü (CustomLogger) tarafından uygulanan satır biçimleri yalnızca yönteminde Log denetlenerek logLevel uygulanmış olabilir. Günlük biçimini yapılandırma yoluyla atamanın amacı, aşağıdaki örnekte gösterildiği gibi geliştiricinin uygulama yapılandırması aracılığıyla günlük biçimini kolayca değiştirebileceğidir.

İstemci tarafı uygulamasında, dosyayı günlük yapılandırmasını içerecek şekilde ekleyin veya güncelleştirin appsettings.json . Günlük biçimini Long üç günlük düzeyinin tümü için olarak ayarlayın:

{
  "Logging": {
    "CustomLog": {
      "LogLevels": {
        "Information": "Long",
        "Warning": "Long",
        "Error": "Long"
      }
    }
  }
}

Yukarıdaki örnekte, özel günlükçü yapılandırması CustomLoggirdisinin ile bir diğer ad [ProviderAlias("CustomLog")]olarak özel günlükçü sağlayıcısına (CustomLoggerProvider) uygulanan olduğuna dikkat edin. Günlük yapılandırması yerine CustomLogadıyla CustomLoggerProvider uygulanmış olabilir, ancak diğer adın CustomLog kullanımı daha kullanıcı dostudur.

Program dosyasında günlük yapılandırmasını kullanın. Şu kodu ekleyin:

builder.Logging.AddConfiguration(
    builder.Configuration.GetSection("Logging"));

çağrısı LoggingBuilderConfigurationExtensions.AddConfiguration , özel günlükçü sağlayıcısını eklemeden önce veya sonra yapılabilir.

Uygulamayı yeniden çalıştırın. Log Messages düğmesini seçin. Günlük yapılandırmasının dosyadan uygulandığına appsettings.json dikkat edin. Üç günlük girdisi de uzun (LogFormat.Long) biçimindedir (istemci uygulaması olarak adlandırılır LoggingTest):

[ 3: Information ] LoggingTest.Pages.CustomLoggerExample - This is an information message.
[ 5: Warning ] LoggingTest.Pages.CustomLoggerExample - This is a warning message.
[ 7: Error ] LoggingTest.Pages.CustomLoggerExample - This is an error message.

İstemci tarafı günlük kapsamları

Geliştirici araçları konsolu günlükçü günlük kapsamlarını desteklemez. Ancak, özel bir günlükçü günlük kapsamlarını destekleyebilir. Gereksinimlerinize uyacak şekilde daha fazla geliştirebileceğiniz desteklenmeyen bir örnek için GitHub örnekleri deposundaki Blazor örnek uygulamaya bakın BlazorWebAssemblyScopesLogger (nasıl indirilir).

Örnek uygulama, günlüğe kaydedilen iletilerin kapsamlarını belirtmek için standart ASP.NET Çekirdek BeginScope günlüğü söz dizimini kullanır. Logger Aşağıdaki örnekteki hizmet, uygulamanın CustomLoggerExample bileşenine (CustomLoggerExample.razor ) eklenen bir ILogger<CustomLoggerExample>hizmetidir.

using (Logger.BeginScope("L1"))
{
    Logger.LogInformation(3, "INFO: ONE scope.");
}

using (Logger.BeginScope("L1"))
{
    using (Logger.BeginScope("L2"))
    {
        Logger.LogInformation(3, "INFO: TWO scopes.");
    }
}

using (Logger.BeginScope("L1"))
{
    using (Logger.BeginScope("L2"))
    {
        using (Logger.BeginScope("L3"))
        {
            Logger.LogInformation(3, "INFO: THREE scopes.");
        }
    }
}

Çıktı:

[ 3: Bilgi ] {CLASS} - BİlGİ: Bİr kapsam. => L1 blazor.webassembly.js:1:35542
[ 3: Bilgi ] {CLASS} - BİlGİ: İkİ kapsam. => L1 => L2 blazor.webassembly.js:1:35542
[ 3: Bilgi ] {CLASS} - BİlGİ: ÜÇ kapsam. => L1 => L2 => L3

{CLASS} Yukarıdaki örnekte yer tutucusu şeklindedirBlazorWebAssemblyScopesLogger.Pages.CustomLoggerExample.

Önceden oluşturulmuş bileşen günlüğü

Önceden oluşturulmuş bileşenler, bileşen başlatma kodunu iki kez yürütür. Günlük, başlatma kodunun ilk yürütülmesinde sunucu tarafında, başlatma kodunun ikinci yürütmesinde de istemci tarafında gerçekleşir. Başlatma sırasında günlüğe kaydetme hedefine bağlı olarak günlükleri sunucu tarafı, istemci tarafı veya her ikisini de denetleyin.

SignalR istemci oluşturucusu SignalR ile istemci günlüğü

Bu bölüm sunucu tarafı uygulamalar için geçerlidir.

Blazor Betik başlatma yapılandırmasındaconfigureSignalR, günlük düzeyiyle çağıran configureLogging yapılandırma nesnesini geçirin.

configureLogging Günlük düzeyi değeri için, bağımsız değişkeni aşağıdaki tabloda gösterilen dize veya tamsayı günlük düzeyi olarak geçirin.

LogLevel Dize ayarı Tamsayı ayarı
Trace trace 0
Debug debug 1
Information information 2
Warning warning 3
Error error 4
Critical critical 5
None none 6

Örnek 1: Günlük düzeyini bir dize değeriyle ayarlayın Information .

Blazor Web App:

<script src="{BLAZOR SCRIPT}" autostart="false"></script>
<script>
  Blazor.start({
    circuit: {
      configureSignalR: function (builder) {
        builder.configureLogging("information");
      }
    }
  });
</script>

Blazor Server:

<script src="{BLAZOR SCRIPT}" autostart="false"></script>
<script>
  Blazor.start({
    configureSignalR: function (builder) {
      builder.configureLogging("information");
    }
  });
</script>

Yukarıdaki örnekte, {BLAZOR SCRIPT} yer tutucu betik yolu ve dosya adıdır Blazor . Betiğin konumu için bkz . ASP.NET Core Blazor proje yapısı.

Örnek 2: Günlük düzeyini bir tamsayı değeriyle ayarlayın Information .

Blazor Web App:

<script src="{BLAZOR SCRIPT}" autostart="false"></script>
<script>
  Blazor.start({
    circuit: {
      configureSignalR: function (builder) {
        builder.configureLogging(2); // LogLevel.Information
      }
    }
  });
</script>

Blazor Server:

<script src="{BLAZOR SCRIPT}" autostart="false"></script>
<script>
  Blazor.start({
    configureSignalR: function (builder) {
      builder.configureLogging(2); // LogLevel.Information
    }
  });
</script>

Yukarıdaki örnekte, {BLAZOR SCRIPT} yer tutucu betik yolu ve dosya adıdır Blazor . Betiğin konumu için bkz . ASP.NET Core Blazor proje yapısı.

Not

Genellikle sihirli sayı veya sihirli sabit olarak adlandırılan Örnek 2'de günlüğe kaydetme düzeyini belirtmek için bir tamsayı kullanılması, kaynak kodu görüntülerken tamsayı günlük düzeyini net bir şekilde tanımlamadığından kötü bir kodlama uygulaması olarak kabul edilir. Tarayıcıya aktarılan baytları en aza indirmek öncelikliyse, tamsayı kullanmak iki yana yaslanabilir (bu gibi durumlarda açıklamayı kaldırmayı göz önünde bulundurun).

Başlatma ( ) hakkında Blazor daha fazla bilgi için bkz. ASP.NET Core Blazor başlatma.Blazor.start()

SignalR uygulama yapılandırmasıyla istemci günlüğü

Uygulama ayarları yapılandırmasını ASP.NET Core Blazor yapılandırmasında açıklandığı gibi ayarlayın. Uygulama ayarı içeren uygulama ayarları dosyalarını bu dosyaya wwwroot Logging:LogLevel:HubConnection yerleştirin.

Not

Uygulama ayarlarını kullanmaya alternatif olarak, bir bileşende LogLevel Razor hub bağlantısı oluşturulduğunda bağımsız değişken LoggingBuilderExtensions.SetMinimumLevel olarak değerini geçirebilirsiniz. Ancak, uygulamayı ayrıntılı günlük kaydıyla yanlışlıkla bir üretim barındırma ortamına dağıtmak performans cezasına neden olabilir. Günlük düzeyini ayarlamak için uygulama ayarlarını kullanmanızı öneririz.

Varsayılan appsettings.json dosyada ve Development ortam uygulama ayarları dosyasında bir Logging:LogLevel:HubConnection uygulama ayarı sağlayın. Varsayılan için tipik bir daha az ayrıntılı günlük düzeyi kullanın, örneğin LogLevel.Warning. Bu ortamlar için uygulama ayarları dosyası yoksa, ve Production ortamlarında Staging kullanılan varsayılan uygulama ayarları değeridir. Gibi ortam uygulaması ayarları dosyasında LogLevel.Traceayrıntılı bir günlük düzeyi Development kullanın.

wwwroot/appsettings.json:

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

wwwroot/appsettings.Development.json:

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

Önemli

Önceki uygulama ayarları dosyalarındaki yapılandırma yalnızca ASP.NET Core Blazor yapılandırmasındaki yönergeler izlenirse uygulama tarafından kullanılır.

Bileşen dosyasının üst kısmında Razor (.razor):

  • öğesine geçirilen günlük sağlayıcılarına eklemek için HubConnectionBuilderbir ILoggerProvider WebAssemblyConsoleLogger ekleyin. bir ConsoleLoggerProvider' WebAssemblyConsoleLogger den farklı olarak, tarayıcıya özgü günlük API'lerinin etrafındaki bir sarmalayıcıdır (örneğin, console.log). kullanımı, WebAssemblyConsoleLogger tarayıcı bağlamında Mono içinde günlüğe kaydetmeyi mümkün kılar.
  • Uygulama ayarını okumak Logging:LogLevel:HubConnection için bir IConfiguration ekler.

Not

WebAssemblyConsoleLoggerdahilidir ve geliştirici kodunda doğrudan kullanım için desteklenmez.

@inject ILoggerProvider LoggerProvider
@inject IConfiguration Config

Not

Aşağıdaki örnek, ile Blazor öğreticisindekiSignalR gösterimi temel alır. Diğer ayrıntılar için öğreticiye bakın.

Bileşenin OnInitializedAsync yönteminde, günlük sağlayıcısını eklemek ve yapılandırmadan en düşük günlük düzeyini ayarlamak için kullanın HubConnectionBuilderExtensions.ConfigureLogging :

protected override async Task OnInitializedAsync()
{
    hubConnection = new HubConnectionBuilder()
        .WithUrl(Navigation.ToAbsoluteUri("/chathub"))
        .ConfigureLogging(builder => 
        {
            builder.AddProvider(LoggerProvider);
            builder.SetMinimumLevel(
                Config.GetValue<LogLevel>("Logging:LogLevel:HubConnection"));
        })
        .Build();

    hubConnection.On<string, string>("ReceiveMessage", (user, message) => ...

    await hubConnection.StartAsync();
}

Not

Yukarıdaki örnekte eklenen Navigation bir NavigationManager' dir.

Uygulamanın ortamını ayarlama hakkında daha fazla bilgi için bkz . ASP.NET Core Blazor ortamları.

İstemci tarafı kimlik doğrulaması günlüğü

Blazor Uygulama ayarlarında bir günlük yapılandırmasıyla veya LogLevel.Trace dosyada için Microsoft.AspNetCore.Components.WebAssembly.Authentication bir günlük filtresi kullanarak kimlik doğrulama iletilerini LogLevel.Debug veya günlük düzeylerinde günlüğe kaydetmeProgram.

Aşağıdaki yaklaşımlardan birini kullanın:

  • Bir uygulama ayarları dosyasında (örneğin, wwwroot/appsettings.Development.json):

    "Logging": {
      "LogLevel": {
        "Microsoft.AspNetCore.Components.WebAssembly.Authentication": "Debug"
      }
    }
    

    İstemci tarafı uygulamasını uygulama ayarları dosyalarını okuyacak şekilde yapılandırma hakkında daha fazla bilgi için bkz . ASP.NET Core Blazor yapılandırması.

  • Aşağıdaki örnek, günlük filtresi kullanarak:

    • C# önişlemci yönergesini Debugkullanarak derleme yapılandırması için günlüğe kaydetmeyi etkinleştirir.
    • Kimlik doğrulama iletilerini günlük düzeyinde günlüğe Blazor Debug kaydeder.
    #if DEBUG
        builder.Logging.AddFilter(
            "Microsoft.AspNetCore.Components.WebAssembly.Authentication", 
            LogLevel.Debug);
    #endif
    

Not

Razor istemcisinde işlenen bileşenler yalnızca istemci tarafı tarayıcı geliştirici araçları konsolunda günlüğe kaydedilir.

Ek kaynaklar