pengelogan ASP.NET Core Blazor
Catatan
Ini bukan versi terbaru dari artikel ini. Untuk rilis saat ini, lihat versi .NET 8 dari artikel ini.
Peringatan
Versi ASP.NET Core ini tidak lagi didukung. Untuk informasi selengkapnya, lihat Kebijakan Dukungan .NET dan .NET Core. Untuk rilis saat ini, lihat versi .NET 8 dari artikel ini.
Penting
Informasi ini berkaitan dengan produk pra-rilis yang mungkin dimodifikasi secara substansial sebelum dirilis secara komersial. Microsoft tidak memberikan jaminan, tersirat maupun tersurat, sehubungan dengan informasi yang diberikan di sini.
Untuk rilis saat ini, lihat versi .NET 8 dari artikel ini.
Artikel ini menjelaskan pengelogan Blazor aplikasi, termasuk konfigurasi dan cara menulis pesan log dari Razor komponen.
Konfigurasi
Konfigurasi pengelogan dapat dimuat dari file pengaturan aplikasi. Untuk informasi selengkapnya, lihat konfigurasi ASP.NET CoreBlazor.
Pada tingkat log default dan tanpa mengonfigurasi penyedia pengelogan tambahan:
- Di server, pengelogan hanya terjadi pada konsol .NET sisi server di
Development
lingkungan di tingkat atau yang LogLevel.Information lebih tinggi. - Pada klien, pengelogan hanya terjadi pada konsol alat pengembang browser sisi klien di tingkat atau yang LogLevel.Information lebih tinggi.
Saat aplikasi dikonfigurasi dalam file proyek untuk menggunakan namespace implisit (<ImplicitUsings>enable</ImplicitUsings>
), using
direktif untuk Microsoft.Extensions.Logging atau API apa pun di LoggerExtensions kelas tidak diperlukan untuk mendukung penyelesaian API Visual Studio IntelliSense atau membangun aplikasi. Jika namespace implisit tidak diaktifkan, Razor komponen harus secara eksplisit menentukan @using
direktif untuk pengelogan namespace yang tidak diimpor melalui _Imports.razor
file.
Tingkat log
Tingkat log sesuai dengan tingkat log aplikasi ASP.NET Core, yang tercantum dalam dokumentasi API di LogLevel.
Razor pengelogan komponen
Arahan using
untuk Microsoft.Extensions.Logging diperlukan untuk mendukung penyelesaian IntelliSense untuk API, seperti LogWarning dan LogError.
Lihat contoh berikut:
- Menyuntikkan ILogger objek (
ILogger<Counter1>
) untuk membuat pencatat. Kategori log adalah nama yang sepenuhnya memenuhi syarat dari jenis komponen,Counter
. - Memanggil LogWarning untuk mencatat pada tingkat Warning.
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++;
}
}
Contoh berikut menunjukkan pengelogan ILoggerFactory dengan komponen dalam.
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++;
}
}
Pengelogan sisi server
Untuk panduan pengelogan ASP.NET Core umum, lihat Pengelogan di .NET Core dan ASP.NET Core.
Pengelogan sisi klien
Tidak setiap fitur pengelogan ASP.NET Core didukung sisi klien. Misalnya, komponen sisi klien tidak memiliki akses ke sistem file atau jaringan klien, sehingga menulis log ke penyimpanan fisik atau jaringan klien tidak dimungkinkan. Saat menggunakan layanan pengelogan pihak ketiga yang dirancang untuk bekerja dengan aplikasi satu halaman (SPAs), ikuti panduan keamanan layanan. Perlu diingat bahwa setiap bagian data, termasuk kunci atau rahasia yang disimpan sisi klien tidak aman dan dapat dengan mudah ditemukan oleh pengguna berbahaya.
Bergantung pada versi kerangka kerja dan fitur pengelogan, implementasi pengelogan mungkin memerlukan penambahan namespace untuk Microsoft.Extensions.Logging ke Program
file:
using Microsoft.Extensions.Logging;
Konfigurasikan pengelogan di aplikasi sisi klien dengan WebAssemblyHostBuilder.Logging properti . Properti Logging berjenis ILoggingBuilderILoggingBuilder , sehingga metode ekstensi didukung.
Untuk mengatur tingkat pengelogan minimum, panggil LoggingBuilderExtensions.SetMinimumLevel pembangun host dalam Program
file dengan LogLevel. Contoh berikut menetapkan tingkat log minimum ke Warning:
builder.Logging.SetMinimumLevel(LogLevel.Warning);
Masuk ke file sisi Program
klien
Pengelogan didukung di aplikasi sisi klien setelah WebAssemblyHostBuilder dibuat menggunakan penyedia pencatat konsol internal kerangka kerja (WebAssemblyConsoleLoggerProvider
(sumber referensi)).
Dalam file Program
:
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();
output konsol Alat pengembang:
info: Program[0]
Logged after the app is built in the Program file.
Catatan
Tautan dokumentasi ke sumber referensi .NET biasanya memuat cabang default repositori, yang mewakili pengembangan saat ini untuk rilis .NET berikutnya. Untuk memilih tag rilis tertentu, gunakan daftar dropdown Beralih cabang atau tag. Untuk informasi lebih lanjut, lihat Cara memilih tag versi kode sumber ASP.NET Core (dotnet/AspNetCore.Docs #26205).
Kategori log sisi klien
Kategori log didukung.
Contoh berikut menunjukkan cara menggunakan kategori log dengan Counter
komponen aplikasi yang dibuat dari Blazor templat proyek.
IncrementCount
Dalam metode komponen aplikasi Counter
(Counter.razor
) yang menyuntikkan ILoggerFactory sebagai LoggerFactory
:
var logger = LoggerFactory.CreateLogger("CustomCategory");
logger.LogWarning("Someone has clicked me!");
output konsol Alat pengembang:
warn: CustomCategory[0]
Someone has clicked me!
ID peristiwa log sisi klien
ID peristiwa log didukung.
Contoh berikut menunjukkan cara menggunakan ID peristiwa log dengan Counter
komponen aplikasi yang dibuat dari Blazor templat proyek.
LogEvent.cs
:
public class LogEvent
{
public const int Event1 = 1000;
public const int Event2 = 1001;
}
IncrementCount
Dalam metode komponen aplikasi Counter
(Counter.razor
):
logger.LogInformation(LogEvent.Event1, "Someone has clicked me!");
logger.LogWarning(LogEvent.Event2, "Someone has clicked me!");
output konsol Alat pengembang:
info: BlazorSample.Pages.Counter[1000]
Someone has clicked me!
warn: BlazorSample.Pages.Counter[1001]
Someone has clicked me!
Templat pesan log sisi klien
Templat pesan log didukung:
Contoh berikut menunjukkan cara menggunakan templat pesan log dengan Counter
komponen aplikasi yang dibuat dari Blazor templat proyek.
IncrementCount
Dalam metode komponen aplikasi Counter
(Counter.razor
):
logger.LogInformation("Someone clicked me at {CurrentDT}!", DateTime.UtcNow);
output konsol Alat pengembang:
info: BlazorSample.Pages.Counter[0]
Someone clicked me at 04/21/2022 12:15:57!
Parameter pengecualian log sisi klien
Parameter pengecualian log didukung.
Contoh berikut menunjukkan cara menggunakan parameter pengecualian log dengan Counter
komponen aplikasi yang dibuat dari Blazor templat proyek.
IncrementCount
Dalam metode komponen aplikasi Counter
(Counter.razor
):
currentCount++;
try
{
if (currentCount == 3)
{
currentCount = 4;
throw new OperationCanceledException("Skip 3");
}
}
catch (Exception ex)
{
logger.LogWarning(ex, "Exception (currentCount: {Count})!", currentCount);
}
output konsol Alat pengembang:
warn: BlazorSample.Pages.Counter[0]
Exception (currentCount: 4)!
System.OperationCanceledException: Skip 3
at BlazorSample.Pages.Counter.IncrementCount() in C:UsersAlabaDesktopBlazorSamplePagesCounter.razor:line 28
Fungsi filter sisi klien
Fungsi filter didukung.
Contoh berikut menunjukkan cara menggunakan filter dengan Counter
komponen aplikasi yang dibuat dari Blazor templat proyek.
Dalam file Program
:
builder.Logging.AddFilter((provider, category, logLevel) =>
category.Equals("CustomCategory2") && logLevel == LogLevel.Information);
IncrementCount
Dalam metode komponen aplikasi Counter
(Counter.razor
) yang menyuntikkan ILoggerFactory sebagai LoggerFactory
:
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!");
Dalam output konsol alat pengembang, filter hanya mengizinkan pengelogan untuk CustomCategory2
kategori dan Information pesan tingkat log:
info: CustomCategory2[0]
Someone has clicked me!
Aplikasi ini juga dapat mengonfigurasi pemfilteran log untuk namespace tertentu. Misalnya, atur tingkat log ke Trace dalam Program
file:
builder.Logging.SetMinimumLevel(LogLevel.Trace);
Biasanya pada Trace tingkat log, output konsol alat pengembang di tingkat Verbose menyertakan Microsoft.AspNetCore.Components.RenderTree pesan pengelogan, seperti berikut ini:
dbug: Microsoft.AspNetCore.Components.RenderTree.Renderer[3]
Rendering component 14 of type Microsoft.AspNetCore.Components.Web.HeadOutlet
Program
Dalam file, pengelogan pesan khusus untuk Microsoft.AspNetCore.Components.RenderTree dapat dinonaktifkan menggunakan salah satu pendekatan berikut:
-
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) ));
Setelah salah satu filter sebelumnya ditambahkan ke aplikasi, output konsol di tingkat Verbose tidak menampilkan pesan pengelogan Microsoft.AspNetCore.Components.RenderTree dari API.
Penyedia pencatat kustom sisi klien
Contoh di bagian ini menunjukkan penyedia pencatat kustom untuk penyesuaian lebih lanjut.
Tambahkan referensi paket ke aplikasi untuk paket.Microsoft.Extensions.Logging.Configuration
Catatan
Untuk panduan tentang menambahkan paket ke aplikasi .NET, lihat artikel di bagian Menginstal dan mengelola paket di Alur kerja konsumsi paket (dokumentasi NuGet). Konfirmasikan versi paket yang benar di NuGet.org.
Tambahkan konfigurasi pencatat kustom berikut. Konfigurasi menetapkan LogLevels
kamus yang mengatur format log kustom untuk tiga tingkat log: Information, Warning, dan Error. Digunakan LogFormat
enum
untuk menjelaskan format pendek (LogFormat.Short
) dan panjang (LogFormat.Long
).
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
}
}
Tambahkan pencatat kustom berikut ke aplikasi. Output CustomLogger
format log kustom berdasarkan nilai yang logLevel
ditentukan dalam konfigurasi sebelumnya CustomLoggerConfiguration
.
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;
}
}
}
}
Tambahkan penyedia pencatat kustom berikut ke aplikasi. CustomLoggerProvider
Options
mengadopsi pendekatan berbasis untuk mengonfigurasi pencatat melalui fitur konfigurasi pengelogan bawaan. Misalnya, aplikasi dapat mengatur atau mengubah format log melalui appsettings.json
file tanpa memerlukan perubahan kode pada pencatat kustom, yang ditunjukkan di akhir bagian ini.
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();
}
}
Tambahkan ekstensi pencatat kustom berikut.
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;
}
}
Program
Dalam file pada pembuat host, hapus penyedia yang ada dengan memanggil ClearProviders dan menambahkan penyedia pengelogan kustom:
builder.Logging.ClearProviders().AddCustomLogger();
Dalam komponen CustomLoggerExample
berikut:
- Pesan debug tidak dicatat.
- Pesan informasi dicatat dalam format pendek (
LogFormat.Short
). - Pesan peringatan dicatat dalam format pendek (
LogFormat.Short
). - Pesan kesalahan dicatat dalam format panjang (
LogFormat.Long
). - Pesan pelacakan tidak dicatat.
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.");
}
}
Output berikut terlihat di konsol alat pengembang browser saat tombol Log Messages
dipilih. Entri log mencerminkan format yang sesuai yang diterapkan oleh pencatat kustom (aplikasi klien diberi nama 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.
Dari inspeksi kasual dari contoh sebelumnya, jelas bahwa mengatur format baris log melalui kamus di CustomLoggerConfiguration
tidak benar-benar diperlukan. Format baris yang diterapkan oleh pencatat kustom (CustomLogger
) bisa saja diterapkan dengan hanya memeriksa logLevel
dalam Log
metode . Tujuan menetapkan format log melalui konfigurasi adalah bahwa pengembang dapat mengubah format log dengan mudah melalui konfigurasi aplikasi, seperti yang ditunjukkan contoh berikut.
Di aplikasi sisi klien, tambahkan atau perbarui appsettings.json
file untuk menyertakan konfigurasi pengelogan. Atur format log ke Long
untuk ketiga tingkat log:
{
"Logging": {
"CustomLog": {
"LogLevels": {
"Information": "Long",
"Warning": "Long",
"Error": "Long"
}
}
}
}
Dalam contoh sebelumnya, perhatikan bahwa entri untuk konfigurasi pencatat kustom adalah CustomLog
, yang diterapkan ke penyedia pencatat kustom (CustomLoggerProvider
) sebagai alias dengan [ProviderAlias("CustomLog")]
. Konfigurasi pengelogan bisa saja diterapkan dengan nama CustomLoggerProvider
alih-alih CustomLog
, tetapi penggunaan alias CustomLog
lebih ramah pengguna.
Program
Dalam file, gunakan konfigurasi pengelogan. Tambahkan kode berikut:
builder.Logging.AddConfiguration(
builder.Configuration.GetSection("Logging"));
Panggilan ke LoggingBuilderConfigurationExtensions.AddConfiguration dapat dilakukan baik sebelum atau sesudah menambahkan penyedia pencatat kustom.
Jalankan aplikasi lagi. Pilih tombol Log Messages
. Perhatikan bahwa konfigurasi pengelogan diterapkan dari appsettings.json
file. Ketiga entri log dalam format panjang (LogFormat.Long
) (aplikasi klien diberi nama 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.
Cakupan log sisi klien
Pencatat konsol alat pengembang tidak mendukung cakupan log. Namun, pencatat kustom dapat mendukung cakupan log. Untuk contoh yang tidak didukung yang dapat Anda kembangkan lebih lanjut sesuai dengan kebutuhan Anda, lihat BlazorWebAssemblyScopesLogger
aplikasi sampel di Blazor repositori GitHub sampel (cara mengunduh).
Aplikasi sampel menggunakan sintaks pengelogan ASP.NET Core BeginScope standar untuk menunjukkan cakupan untuk pesan yang dicatat. Layanan Logger
dalam contoh berikut adalah ILogger<CustomLoggerExample>
, yang disuntikkan ke dalam komponen aplikasi CustomLoggerExample
(CustomLoggerExample.razor
).
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: Informasi ] {CLASS} - INFO: SATU cakupan. => L1 blazor.webassembly.js:1:35542
[ 3: Informasi ] {CLASS} - INFO: DUA cakupan. => L1 => L2 blazor.webassembly.js:1:35542
[ 3: Informasi ] {CLASS} - INFO: TIGA cakupan. => L1 => L2 => L3
Tempat {CLASS}
penampung dalam contoh sebelumnya adalah BlazorWebAssemblyScopesLogger.Pages.CustomLoggerExample
.
Pengelogan komponen yang telah dirender sebelumnya
Komponen yang telah dirender menjalankan kode inisialisasi komponen dua kali. Pengelogan terjadi di sisi server pada eksekusi pertama kode inisialisasi dan sisi klien pada eksekusi kedua kode inisialisasi. Tergantung pada tujuan pengelogan selama inisialisasi, periksa log sisi server, sisi klien, atau keduanya.
SignalR pengelogan SignalR klien dengan pembuat klien
Bagian ini berlaku untuk aplikasi sisi server.
Dalam Blazor konfigurasi mulai skrip, teruskan configureSignalR
objek konfigurasi yang memanggil configureLogging
dengan tingkat log.
configureLogging
Untuk nilai tingkat log, berikan argumen sebagai tingkat log string atau bilangan bulat yang diperlihatkan dalam tabel berikut.
LogLevel | Pengaturan string | Pengaturan bilangan bulat |
---|---|---|
Trace | trace |
0 |
Debug | debug |
1 |
Information | information |
2 |
Warning | warning |
3 |
Error | error |
4 |
Critical | critical |
5 |
None | none |
6 |
Contoh 1: Atur Information tingkat log dengan nilai string.
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>
Dalam contoh sebelumnya, {BLAZOR SCRIPT}
tempat penampung adalah Blazor jalur skrip dan nama file. Untuk lokasi skrip, lihat struktur proyek ASP.NET CoreBlazor.
Contoh 2: Atur Information tingkat log dengan nilai bilangan bulat.
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>
Dalam contoh sebelumnya, {BLAZOR SCRIPT}
tempat penampung adalah Blazor jalur skrip dan nama file. Untuk lokasi skrip, lihat struktur proyek ASP.NET CoreBlazor.
Catatan
Menggunakan bilangan bulat untuk menentukan tingkat pengelogan di Contoh 2, sering disebut sebagai angka ajaib atau konstanta ajaib, dianggap sebagai praktik pengkodean yang buruk karena bilangan bulat tidak mengidentifikasi tingkat pengelogan dengan jelas saat melihat kode sumber. Jika meminimalkan byte yang ditransfer ke browser adalah prioritas, menggunakan bilangan bulat mungkin dibenarkan (pertimbangkan untuk menghapus komentar dalam kasus seperti itu).
Untuk informasi selengkapnya tentang Blazor startup (Blazor.start()
), lihat startup ASP.NET CoreBlazor.
SignalR pengelogan klien dengan konfigurasi aplikasi
Siapkan konfigurasi pengaturan aplikasi seperti yang dijelaskan dalam konfigurasi ASP.NET CoreBlazor. Tempatkan file pengaturan aplikasi yang wwwroot
berisi Logging:LogLevel:HubConnection
pengaturan aplikasi.
Catatan
Sebagai alternatif untuk menggunakan pengaturan aplikasi, Anda dapat meneruskan LogLevel sebagai argumen LoggingBuilderExtensions.SetMinimumLevel saat koneksi hub dibuat dalam Razor komponen. Namun, secara tidak sengaja menyebarkan aplikasi ke lingkungan hosting produksi dengan pengelogan verbose dapat mengakibatkan penalti performa. Sebaiknya gunakan pengaturan aplikasi untuk mengatur tingkat log.
Logging:LogLevel:HubConnection
Berikan pengaturan aplikasi di file default appsettings.json
dan di Development
file pengaturan aplikasi lingkungan. Gunakan tingkat log yang kurang verbose umum untuk default, seperti LogLevel.Warning. Nilai pengaturan aplikasi default adalah apa yang digunakan di Staging
lingkungan dan Production
jika tidak ada file pengaturan aplikasi untuk lingkungan tersebut yang ada. Gunakan tingkat log verbose dalam Development
file pengaturan aplikasi lingkungan, seperti LogLevel.Trace.
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"
}
}
}
Penting
Konfigurasi dalam file pengaturan aplikasi sebelumnya hanya digunakan oleh aplikasi jika panduan dalam konfigurasi ASP.NET Core Blazor diikuti.
Di bagian Razor atas file komponen (.razor
):
- ILoggerProvider Masukkan untuk menambahkan
WebAssemblyConsoleLogger
ke penyedia pengelogan yang diteruskan ke HubConnectionBuilder. ConsoleLoggerProviderTidak seperti ,WebAssemblyConsoleLogger
adalah pembungkus di sekitar API pengelogan khusus browser (misalnya,console.log
). Penggunaan memungkinkan pengeloganWebAssemblyConsoleLogger
dalam Mono di dalam konteks browser. - Suntikkan
IConfiguration
untuk membacaLogging:LogLevel:HubConnection
pengaturan aplikasi.
Catatan
WebAssemblyConsoleLogger
bersifat internal dan tidak didukung untuk penggunaan langsung dalam kode pengembang.
@inject ILoggerProvider LoggerProvider
@inject IConfiguration Config
Catatan
Contoh berikut didasarkan pada demonstrasi dalam SignalR tutorial.Blazor Lihat tutorial untuk detail lebih lanjut.
Dalam metode komponenOnInitializedAsync
, gunakan HubConnectionBuilderExtensions.ConfigureLogging untuk menambahkan penyedia pengelogan dan mengatur tingkat log minimum dari konfigurasi:
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();
}
Catatan
Dalam contoh sebelumnya, Navigation
adalah disuntikkan NavigationManager.
Untuk informasi selengkapnya tentang pengaturan lingkungan aplikasi, lihat lingkungan ASP.NET CoreBlazor.
Pengelogan autentikasi sisi klien
Catat Blazor pesan autentikasi di LogLevel.Debug tingkat pengelogan atau LogLevel.Trace dengan konfigurasi pengelogan di pengaturan aplikasi atau dengan menggunakan filter log untuk Microsoft.AspNetCore.Components.WebAssembly.Authentication dalam Program
file.
Gunakan salah satu pendekatan berikut:
Dalam file pengaturan aplikasi (misalnya,
wwwroot/appsettings.Development.json
):"Logging": { "LogLevel": { "Microsoft.AspNetCore.Components.WebAssembly.Authentication": "Debug" } }
Untuk informasi selengkapnya tentang cara mengonfigurasi aplikasi sisi klien untuk membaca file pengaturan aplikasi, lihat konfigurasi ASP.NET CoreBlazor.
Menggunakan filter log, contoh berikut:
- Mengaktifkan pengelogan
Debug
untuk konfigurasi build menggunakan arahan preprocessor C#. - Blazor Mencatat pesan autentikasi di Debug tingkat log.
#if DEBUG builder.Logging.AddFilter( "Microsoft.AspNetCore.Components.WebAssembly.Authentication", LogLevel.Debug); #endif
- Mengaktifkan pengelogan
Catatan
Razorkomponen yang dirender pada klien hanya masuk ke konsol alat pengembang browser sisi klien.
Sumber Daya Tambahan:
- Pengelogan di .NET Core dan ASP.NET Core
Loglevel
Enum (dokumentasi API)- Menerapkan penyedia pengelogan kustom di .NET
- Dokumentasi alat pengembang browser:
- Blazorsampel repositori GitHub () (
dotnet/blazor-samples
cara mengunduh)
ASP.NET Core