此文是在官方文档的基础上做的个人笔记,一些简单的内容就没用再列出来了,参考官方文档: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}.json
的Logging
节点配置。core web框架自带如下:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
}
}
- 指定了
Default
、Microsoft
、Microsoft.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.Hosting | HTTP 请求完成的时间和启动时间。 加载了哪些承载启动程序集。 |
Microsoft.AspNetCore.Mvc | MVC 和 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