Aracılığıyla paylaş


ASP.NET Core Blazor günlüğü

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

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

Configuration

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 IntelliSenseusingiçin Microsoft.Extensions.Logging yönerge LoggerExtensions 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 @using açıkça tanımlamalıdır_Imports.razor.

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 usingMicrosoft.Extensions.Logging API'ler için IntelliSenseLogWarningiçin için yönergesi LogError 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
  • LogWarning düzeyinde günlüğe kaydetmek için Warning 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ı kayıt tutma

Genel ASP.NET Core günlükleme rehberi için bkz . .NET ve ASP.NET Core'da günlükleme.

İ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 LoggingBuilderExtensions.SetMinimumLevel çağırın.ProgramLogLevel 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.

Note

.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 Counter oluşturulan bir uygulamanın bileşeniyle Blazor günlük kategorilerinin nasıl kullanılacağı gösterilmektedir.

IncrementCount Olarak bir CounterCounter.razorekleyen uygulamanın ILoggerFactory bileşeni (LoggerFactory) 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 Counter oluşturulan bir uygulamanın bileşeniyle Blazor 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 Counter oluşturulan bir uygulamanın bileşeniyle Blazor 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 Counter oluşturulan bir uygulamanın bileşeniyle Blazor 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 Counter oluşturulan bir uygulamanın bileşeniyle Blazor 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 CounterCounter.razorekleyen uygulamanın ILoggerFactory bileşeni (LoggerFactory) 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 CustomCategory2 günlük düzeyi iletisi için günlüğe kaydetmeye Information 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 biriMicrosoft.AspNetCore.Components.RenderTreebelirli 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.

Note

.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 LogFormatenum, 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 logLevel yapılandırmada tanımlanan değerlere göre CustomLoggerConfiguration çı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 logLevel denetlenerek Log 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 CustomLoggerProviderolarak özel günlükçü sağlayıcısına ([ProviderAlias("CustomLog")]) uygulanan olduğuna dikkat edin. Günlük yapılandırması yerine CustomLoggerProvideradıyla CustomLog 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 deposundakiBlazorWebAssemblyScopesLoggerBlazor örnek uygulamaya bakın (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 ILogger<CustomLoggerExample> bileşenine (CustomLoggerExample ) eklenen bir CustomLoggerExample.razorhizmetidir.

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.");
        }
    }
}

Output:

[ 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ı.

Note

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 bkzBlazor.start().Blazor

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 wwwrootLogging:LogLevel:HubConnection yerleştirin.

Note

Uygulama ayarlarını kullanmaya alternatif olarak, bir bileşende LogLevelLoggingBuilderExtensions.SetMinimumLevel hub bağlantısı oluşturulduğunda bağımsız değişken Razor 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 Logging:LogLevel:HubConnection dosyada ve appsettings.json ortam uygulama ayarları dosyasında bir Development 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 Staging ortamlarında Production kullanılan varsayılan uygulama ayarları değeridir. Gibi ortam uygulaması ayarları dosyasında Developmentayrıntılı bir günlük düzeyi LogLevel.Trace 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"
    }
  }
}

Important

Ö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 ILoggerProviderbir WebAssemblyConsoleLoggerHubConnectionBuilder 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 IConfiguration için bir Logging:LogLevel:HubConnection ekler.

Note

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

@inject ILoggerProvider LoggerProvider
@inject IConfiguration Config

Note

Aşağıdaki örnek, ile SignalR öğreticisindekiBlazor 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();
}

Note

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.Debug dosyada için LogLevel.Trace bir günlük filtresi kullanarak kimlik doğrulama iletilerini Microsoft.AspNetCore.Components.WebAssembly.Authentication 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 BlazorDebug kaydeder.
    #if DEBUG
        builder.Logging.AddFilter(
            "Microsoft.AspNetCore.Components.WebAssembly.Authentication", 
            LogLevel.Debug);
    #endif
    

Note

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

Ek kaynaklar