ASP.NET Core 基础(八)——日志记录

此文是在官方文档的基础上做的个人笔记,一些简单的内容就没用再列出来了,参考官方文档:https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/logging/?view=aspnetcore-5.0

日志组件包括提供器(Provider)和记录器(Logger)

1.日志提供程序(Log provider)

框架自带的日志provider有以下几种,前4个都在CreateDefaultBuilder里被添加进去,后续几个需要添加nuget包。

  • 控制台:即Consol.WriteLine()
  • 调试:即Debug.WriteLine()
  • EventSource:EventSource 提供程序写入名称为 Microsoft-Extensions-Logging 的跨平台事件源。 在 Windows 上,提供程序使用的是 ETW(Event Tracing for Windows)。使用dot-trace和perfview可以分析ETW日志。
  • EventLog:仅适用于Windows。将日志输出到window事件日志。默认的日志等级为Information
  • Azure应用服务:将日志写入AzureAppSerivce和AzureAppServiceBlob
  • ApplicationInsights:使用方法,https://docs.microsoft.com/zh-cn/azure/azure-monitor/app/app-insights-overview

如果要替换CreateDefaultBuilder里添加的提供程序,调用ClearProviders方法即可:

Host.CreateDefaultBuilder(args)
        .ConfigureLogging(logging =>
        {
            logging.ClearProviders();
            logging.AddConsole();
        })

2.日志配置

通常由appsettings.{Environment}.jsonLogging节点配置。core web框架自带如下:

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  }
}
  • 指定了DefaultMicrosoftMicrosoft.Hosting.Lifetime三种类别的日志等级分别是什么。类别就是ILogger<T>里的那个泛型T的类型。若要想自己输入类别名称,则使用ILoggerFactory,然后调用CreateLogger("customCategoryXXXX")方法创建logger
  • Microsoft类别:表示泛型T以Microsoft开头
  • Microsoft.Hosting.Lifetime类别:理论上在Microsoft类别里已经包括了这个。这里把这个单独列出来表示要单独处理,输出Information以上的数据。

LogLevel包括以下几个,范围从0到6:Trace=0,Debug=1,Information=2, Warning=3, Error=4, Critical=5, None=6。如果未制定LogLevel则默认为Information。

3.指定某些Provider的等级

{
  "Logging": {
    "LogLevel": { //默认项:适用于所有的provider
      "Default": "Error",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Warning"
    },
    "Debug": { // Debug provider.里面的配置会覆盖默认
      "LogLevel": {
        "Default": "Information" // Overrides preceding LogLevel:Default setting.
      }
    },
    "Console": {
      "IncludeScopes": true,
      "LogLevel": {
        "Microsoft.AspNetCore.Mvc.Razor.Internal": "Warning",
        "Microsoft.AspNetCore.Mvc.Razor.Razor": "Debug",
        "Microsoft.AspNetCore.Mvc.Razor": "Error",
        "Default": "Information"
      }
    },
    "EventSource": {
      "LogLevel": {
        "Microsoft": "Information"
      }
    },
    "EventLog": {
      "LogLevel": {
        "Microsoft": "Information"
      }
    },
    "AzureAppServicesFile": {
      "IncludeScopes": true,
      "LogLevel": {
        "Default": "Warning"
      }
    },
    "AzureAppServicesBlob": {
      "IncludeScopes": true,
      "LogLevel": {
        "Microsoft": "Information"
      }
    },
    "ApplicationInsights": {
      "LogLevel": {
        "Default": "Information"
      }
    }
  }
}

Logging.{providerName}.LogLevel中的设置将替代Logging.LogLevel中的设置。

若要阻止所有日志的显示,则将LogLevel设置为None,因为他的值是6高于其它。

4.通过纯代码的方式配置日志

通常都不会这么做,但你依然可以删除appsettings.json,然后在代码中如下配置:

Host.CreateDefaultBuilder(args)
    .ConfigureLogging(logging => logging.SetMinimumLevel(LogLevel.Warning))
    .

5.日志筛选filter

还可以通过代码设置过滤器,来设置哪些日志可以显示出来,同样通常也不这么做。

Host.CreateDefaultBuilder(args)
            .ConfigureLogging(logging =>
            {
                logging.AddFilter((provider, category, logLevel) =>
                {
                    if (provider.Contains("ConsoleLoggerProvider")
                        && category.Contains("Controller")
                        && logLevel >= LogLevel.Information)
                    {
                        //提供程序叫做ConsoleLoggerProvider且类别包括Controller
                        //且等级大于等于Information的日志才显示输出
                        return true;
                    }
                    else if (provider.Contains("ConsoleLoggerProvider")
                        && category.Contains("Microsoft")
                        && logLevel >= LogLevel.Information)
                    {
                        //提供程序叫做ConsoleLoggerProvider且类别包括Microsoft
                        //且等级大于等于Information的日志才显示输出
                        return true;
                    }
                    else
                    {
                        //其它日志过滤掉不显示
                        return false;
                    }
                });
                //只输出类别为System且等级为Debug的日志,针对所有provider有效
                logging.AddFilter("System",Loglevel.Debug);
                //只输出DebugLoggerProvider提供器下,类别为Microsoft且等级为Information的日志
                logging.AddFilter<DebugLoggerProvider>("Microsoft",LogLevel.Information);
            })

6.框架和EF自带的一些类别

类别名功能
Microsoft.AspNetCore常规 ASP.NET Core 诊断。
Microsoft.AspNetCore.DataProtection考虑、找到并使用了哪些密钥。
Microsoft.AspNetCore.HostFiltering所允许的主机。
Microsoft.AspNetCore.HostingHTTP 请求完成的时间和启动时间。 加载了哪些承载启动程序集。
Microsoft.AspNetCore.MvcMVC 和 Razor 诊断。 模型绑定、筛选器执行、视图编译和操作选择。
Microsoft.AspNetCore.Routing路由匹配信息。
Microsoft.AspNetCore.Server连接启动、停止和保持活动响应。 HTTP 证书信息。
Microsoft.AspNetCore.StaticFiles提供的文件。
Microsoft.EntityFrameworkCore常规 Entity Framework Core 诊断。 数据库活动和配置、更改检测、迁移。

7.如何在控制台应用中使用Logging

static void Main(string[] args)
{
        using var loggerFactory = LoggerFactory.Create(builder =>
        {
            builder
                .AddFilter("Microsoft", LogLevel.Warning)
                .AddFilter("System", LogLevel.Warning)
                .AddFilter("LoggingConsoleApp.Program", LogLevel.Debug)
                .AddConsole()
                .AddEventLog();
        });
        ILogger logger = loggerFactory.CreateLogger<Program>();
        logger.LogInformation("Example log message");
}

7.1 如何在docker容器中打印日志

参考:控制台日志格式设置

在容器中输出日志时,默认是json格式,会有很多内容。人类看起来不够友好。所以可以通过以下方式进行友好化展示设置:

//.net 6
var builder = WebApplication.CreateBuilder(args);
builder.Logging.AddSystemdConsole(opt =>
{
    opt.IncludeScopes = true;
    opt.TimestampFormat = "yyyy-MM-dd HH:mm:ss:fff";
});

8.自定义日志提供器(Provider)和记录器(Logger)

参考https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/logging/?view=aspnetcore-5.0#create-a-custom-logger

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JimCarter

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值