ASP.NET Core Blazor günlüğü
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.
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:
- Sunucuda, günlük yalnızca ortamdaki LogLevel.Information sunucu tarafı .NET konsolunda
Development
veya düzeyinde gerçekleşir. - İstemcide günlük kaydı yalnızca istemci tarafı tarayıcı geliştirici araçları konsolunda LogLevel.Information veya daha üst düzeyde gerçekleşir.
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 LoggerFactory
ekleyen 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 LoggerFactory
ekleyen 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.Short
LogFormat.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 Options
yaklaşı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ı CustomLog
girdisinin 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 CustomLog
adı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 birIConfiguration
ekler.
@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
Debug
kullanarak 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
- C# önişlemci yönergesini
Not
Razor istemcisinde işlenen bileşenler yalnızca istemci tarafı tarayıcı geliştirici araçları konsolunda günlüğe kaydedilir.
Ek kaynaklar
- .NET Core ve ASP.NET Core'da günlük
Loglevel
Enum (API belgeleri)- .NET'te özel günlük sağlayıcısı uygulama
- Tarayıcı geliştirici araçları belgeleri:
- Blazorörnekler GitHub deposu () (
dotnet/blazor-samples
nasıl indirilir)
ASP.NET Core