Прийшов час осідлати справжнього Буцефала🏇🏻Приборкай норовливого коня разом з Newxel🏇🏻Умови на сайті
×Закрыть

Налаштовуємо Blazor Server Logging

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті.

Привіт!

Сьогодні подивимось, як налаштовувати логування в BlazorServer.

Одразу після створення проекту в корені проекту буде файл appsettings.json.

json
{
  "Logging": {

    "LogLevel": {

      "Default": "Information",

      "Microsoft": "Warning",

      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*"
}

Саме тут вказано налаштування логування. LogLevel починається з Default, який має значення Information. Це означає, що за замовчуванням лог левел буде Information. Далі йде Microsoft з рівнем Warning, відповідно для namespace Microsoft рівень логування буде Warning. І в самому кінці Microsoft.Hosting.Lifetime має значення Information. Це означає що для всього namespace Microsoft, окрім частини Hosting.Lifetime буде значення Warning.

Якщо змінити налаштування логування, в цьому файлі і запустити аплікації нічого не зміниться. А все тому, що в launchSettings.json вказано "ASPNETCORE_ENVIRONMENT": "Development". І для development середовища використовується інший файл appsettings.Development.json. Знайти його можна, якщо натиснути на стрілку біля appsettings.json.

Я поміняю всі рівні на Debug в appsettings.Development.json.

{
  "DetailedErrors": true,

  "Logging": {

    "LogLevel": {

      "Default": "Debug",

      "Microsoft": "Debug",

      "Microsoft.Hosting.Lifetime": "Debug"
    }
  }
}

Після цього запущу аплікацію. І побачу багато логів в консолі.

Якщо мені потрібно з усіх логів включити тільки якийсь конкретний, я теж можу це зробити.

Наприклад, мені потрібно бачити логи з Microsoft.AspNetCore.Components.RenderTree.Renderer в Debug а всі інші в інфо. Для цього я добавлю його в appsettings.Development.json.

{
  "DetailedErrors": true,

  "Logging": {

    "LogLevel": {

      "Default": "Information",

      "Microsoft": "Warning",

      "Microsoft.Hosting.Lifetime": "Information",

      "Microsoft.AspNetCore.Components.RenderTree.Renderer": "Debug" 
    }
  }
}

Після цього логи будуть виглядати ось так

Logging from razor pages

Спробуєм відправити лог повідомлення з razor pages. Наприклад, візьмемо сторінку Counter.razor.

Для використання логера спочатку потрібно імпортувати потрібний неймспейс @using Microsoft.Extensions.Logging. І за допомогою DI, ввести логер в сторінку @inject ILogger<Counter> Logger. Тепер логер можна використувати в сторінці.

@page "/counter"

@using Microsoft.Extensions.Logging

@inject ILogger<Counter> 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()
    {
        currentCount++;
        Logger.LogInformation("Button clicked, current count #{count}", currentCount);
    }
}

Кожен раз як я натискаю кнопку Click me. Повідомлення з’являється в консолі.

Logging from class

Аналогічно лог повідомлення можна відправляти з класів за допомогою DI. Спочатку створюється об’єкт private readonly ILogger<WeatherForecastService> _logger; і за допомогою конструктора передаємо наш логер.

using Microsoft.Extensions.Logging;

using System;

using System.Linq;

using System.Threading.Tasks;

namespace BlazorLearn.Data
{
    public class WeatherForecastService
    {
        private readonly ILogger<WeatherForecastService> _logger;

        private static readonly string[] Summaries = new[]
        {
            "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
        };
        public WeatherForecastService(ILogger<WeatherForecastService> logger)
        {
            _logger = logger;
        }
        public Task<WeatherForecast[]> GetForecastAsync(DateTime startDate)
        {
            _logger.LogInformation("WeatherForecastService called");
            var rng = new Random();
            return Task.FromResult(Enumerable.Range(1, 5).Select(index => new WeatherForecast
            {
                Date = startDate.AddDays(index),
                TemperatureC = rng.Next(1, 100),
                Summary = Summaries[rng.Next(Summaries.Length)]
            }).ToArray());
        }
    }
}

Logger configuration from code

Якщо потрібно, то логер можна конфігурвати з коду, а не з application.json. Це можна зробити в Program.cs в методі CreateHostBuilder. По замовчуванні він має такий вигляд.

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });

Для того, щоб налаштувати логер до CreateDefaultBuilder, потрібно добавити ConfigureLogging

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureLogging(logger =>
                {
                    logger.ClearProviders();
                    logger.SetMinimumLevel(LogLevel.Information);
                    logger.AddConsole();
                })
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });

logger.ClearProviders() очищає всі попередні налаштування. І після нього одразу можна додавати інший log provider, наприклад Seriolog чи будь-який інший.

logger.SetMinimumLevel(LogLevel.Information) — вказує мінімальний лог левел.

logger.AddConsole() — додає вивід логів в консоль.

LinkedIn

Похожие статьи

Допустимые теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Допустимые теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Мы прошлым летом сайтик написали для своей компании на blazor.
А вы давно с blazor работаете?

Тільки недавно почав працювати, і то для себе

Подписаться на комментарии