Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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:
- Sunucuda, günlük yalnızca ortamdaki
Developmentsunucu tarafı .NET konsolunda LogLevel.Information 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 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'WebAssemblyConsoleLoggerden farklı olarak, tarayıcıya özgü günlük API'lerinin etrafındaki bir sarmalayıcıdır (örneğin,console.log). kullanımı,WebAssemblyConsoleLoggertarayıcı bağlamında Mono içinde günlüğe kaydetmeyi mümkün kılar. - Uygulama ayarını okumak
IConfigurationiçin birLogging:LogLevel:HubConnectionekler.
@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- C# önişlemci yönergesini
Note
Razor istemcisinde işlenen bileşenler yalnızca istemci tarafı tarayıcı geliştirici araçları konsolunda günlüğe kaydedilir.
Ek kaynaklar
- .NET ve ASP.NET Core'da oturum açma
-
LoglevelEnum (API belgeleri) - .NET'te özel günlük sağlayıcısı uygulama
- Tarayıcı geliştirici araçları belgeleri:
-
Blazor (
dotnet/blazor-samplesnasıl indirilir)
ASP.NET Core