• 深入浅出Blazor webassembly之Logging


    ===============================

    Aspnet core 的日志配置文件设置

    ===============================

    appsettings.json 文件中可以设置日志

       "Logging": {
            "LogLevel": {  //No specific provider, 将适用于所有的Provider
                "Default": "Information", //Default category for Logger Object, 即 ILogger<T> 中 T 为 category
                "Microsoft": "Warning", 
                "Microsoft.Hosting.Lifetimne": "Information"
            },
            "EventSource": {  //仅适用于 EventSource Provider
                "Default": "Information"
            }
        }

    logging配置的层次关系是  Logging.{provider_name.}LogLevel

    对于 blazor wsam 应用,  配置文件的logging 配置并不起任何作用. 

    但可以在 program.cs Main函数用代码的形式设置最低输出级别.

     builder.Logging.SetMinimumLevel(LogLevel.Information);

    ===============================

    最简单的日志输出

    ===============================

    在Blazor wasm 程序中使用Console.WriteLine(), 即可输出到浏览器的console 中, 非常方便. 

    缺点是: 没有LogLevel的控制

    razor 文件中的代码:

        private void IncrementCount()
        {
            currentCount++;
            Console.WriteLine("Console.WriteLine() output. ");
        }

    效果:

    ===============================

    内置的Logging类

    ===============================

    Blazor项目中, 在默认情况下, 即可注入 Microsoft.Extensions.Logging.Logger 日志类实例.

    优点: 使用非常方便, 而且可以进行 LogLevel 控制

    缺点: 仅仅能输出字符串信息, 不能直接输出 object 对象或List或数组.

    razor 文件代码:

    @page "/counter"
    @using Microsoft.Extensions.Logging
    @inject ILogger<Counter> MyLogger 
    
    
    <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++;
            MyLogger.LogInformation("LogInformation");
            MyLogger.LogTrace("LogTrace");  //内置Logger类 不支持这个Trace level
            MyLogger.LogWarning("LogWarning");
            MyLogger.LogDebug("LogDebug");
            MyLogger.LogError("LogError");
             
            MyLogger.LogCritical("LogCritical");  //输出这个记录的日志, 浏览器底部将出现一个Unhandled error 提示条
        }
    }

    效果如下:

    ===============================

    增强版的 Blazor.Extensions.Logging 包

    ===============================

    增强版的 Blazor.Extensions.Logging 包具体增强点有:

    1. 能直接输出接输出object/list/array 对象

    2. 支持Trace Level的日志, 不过这个用处并不大

    3. logging输出格式也比较好看.

    该组件的问题是:  在代码中一起输出两行 Logging , 浏览器中看到的次序正好和代码相反.

    Blazor.Extensions.Logging 同样实现了 ILogger<T> 接口,  所以使用方式和内置的Logger类一样. 

    使用步骤:

    1. 为项目增加: Blazor.Extensions.Logging 包引用

    dotnet add package Blazor.Extensions.Logging

    2. 将 扩展logging 类注册的 DI 容器, Program.cs 的 Main() 方法中,

    using Blazor.Extensions.Logging;
    
    //Main 方法中
    // Add Blazor.Extensions.Logging.BrowserConsoleLogger
    builder.Services.AddLogging(builder => builder
        .AddBrowserConsole()
        .SetMinimumLevel(LogLevel.Trace)
    );

    3. 在Razor 类中, 注入 ILogger<T> 对象

    @* //引入 ILogger 接口 *@
    @using Microsoft.Extensions.Logging    
    @* //引入 Log(object) 扩展方法 *@
    @using Blazor.Extensions.Logging   
    @* //注入 Logger 对象 *@
    @inject ILogger<Counter> MyLogger    
    @code {
    
        private void IncrementCount()
        {
            currentCount++;
            MyLogger.LogInformation(MyLogger.GetType().ToString());
            MyLogger.LogInformation("1: LogInformation");        
            MyLogger.LogWarning("2: LogWarning");
            MyLogger.LogDebug("3: LogDebug");
            MyLogger.LogError("4: LogError");
            MyLogger.LogCritical("5: LogCritical");  //输出这个记录的日志, 浏览器底部不会出现一个Unhandled error 提示条
            MyLogger.LogInformation(new List<string> { ".A", ".B", ".C" });
            MyLogger.LogInformation(new {Name="张三",Age=20,Like="LOL"});
        }
    }

    =====================================

    Serilog.Sinks.BrowserConsole 和 Serilog.Sinks.BrowserHttp

    =====================================

    参考 https://nblumhardt.com/2019/11/serilog-blazor/

    这里仅仅介绍  Serilog.Sinks.BrowserConsole, 一般项目支持 appsettings.json 中配置logging属性, 但 blazor 项目不支持.

    使用步骤:

    1. 安装 nuget 包,

       dotnet add package Serilog.Sinks.BrowserConsole

    2.  Program.cs 文件初始化全局 Serilog.Log.Logger 对象

    3. 记日志方式, 不同于微软的 logger, 需要注入 logger 对象, serilog 直接使用 全局 Serilog.Log.Logger对象, 记录日志.

    Program.cs 的代码:

    using Microsoft.AspNetCore.Components.WebAssembly.Hosting;
    using Microsoft.Extensions.Configuration;
    using Microsoft.Extensions.DependencyInjection;
    using Microsoft.Extensions.Logging;
    using System;
    using System.Collections.Generic;
    using System.Net.Http;
    using System.Text;
    using System.Threading.Tasks;
    using Serilog.Configuration;
    using Serilog;
    using Serilog.Core;
    using Serilog.Events;
    
    
    namespace WebApplication2
    {
        public class Program
        {
            public static async Task Main(string[] args)
            {
                var builder = WebAssemblyHostBuilder.CreateDefault(args);
                builder.RootComponents.Add<App>("#app");
    
    
                builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) });
    
                //设置 level 控制对象
                 var logLevelSwitch = new LoggingLevelSwitch(LogEventLevel.Debug); //默认为 Info level
    
                //生成一个全局的 Logger
                Log.Logger = new LoggerConfiguration()
                    .WriteTo.BrowserConsole()
                    .MinimumLevel.ControlledBy(logLevelSwitch)
                    .Enrich.WithProperty("InstanceId", Guid.NewGuid().ToString("n"))
                    .CreateLogger();
    
                await builder.Build().RunAsync();
            }
        }
    }

    生成 Logger对象的写法, 有点特殊, 都是基于 LoggerConfiguration 类中多个角度的子配置完成的.

     

    记录日志示例代码:

    @page "/counter"
    @using Serilog
    
    <h1>Counter</h1>
    
    <p>Current count: @currentCount</p>
    
    <button class="btn btn-primary" @onclick="IncrementCount">Click me</button>
    
    @code {
        class Person
        {
            public String Name { get; set; }
            public int Age { get; set; }
        }
        private int currentCount = 0;
    
        private void IncrementCount()
        {
            currentCount++;
            Log.Logger.Debug("Debug: Person data is {@Person}", new Person() { Name="Harry", Age=10});
            Log.Logger.Information("Info: Person2 data is {P2}", new   { Name = "Harry2", Age = 20 });
            Log.Logger.Information("Info:List is {@lst}", new List<String>() { "A", "B" });
            Log.Logger.Information("Info:List is {lst}", new List<String>() { "A", "B" });
    } }

    ===============================

    结论

    ===============================

    推荐使用 Serilog.Sinks.BrowserConsole

  • 相关阅读:
    POJ 3660 Cow Contest
    HDOJ 2093 sscanf的使用,字符串对齐,快排
    HDOJ 2091 空格的特殊输入输出格式
    COJ 1081: 集训队分组
    HDOJ 2948 错排公式
    POJ 1936 All in All
    POJ 1035 Spell checker
    HDOJ 2094 set和map的使用
    HDOJ 2036 多边形的面积
    HDOJ 1166 敌兵布阵
  • 原文地址:https://www.cnblogs.com/harrychinese/p/blazor_logging.html
Copyright © 2020-2023  润新知