1.日志级别:Trace < Debug < Information < Warning < Error < Critical
2.日志提供者(LoggingProvider):把日志输出到哪里?控制台、文件、数据库等。
3.对于业务代码只要注入日志对象记录日志,具体哪些日志输出到哪里、什么格式、是否输出都可以通过配置或者初始化代码决定(日志框架来最终实现,业务只关心写)。
输出到控制台:
1.NuGet:Microsoft.Extensions.Logging、Microsoft.Extensions.Logging.Console
2.DI注入:services.AddLogging(logBuilder=>{logBuilder.AddConsole();});
3.需要记录日志的代码,注入ILogger即可,T一般就用当前类,这个类的名字会输出到日志,方便定位错误。让后调用LogInformation()、LogError等方法输出不同级别的日志,还支持输出异常对象。
Note:
1.Console只适合开发阶段,运行阶段需要输出到文件。
2.采用和Configuration类似的扩展机制,不仅内置了Debug、事件查看器、文件、Azure日志等提供者,还可以拓展。
3.EventLog:Windows Only。在Windows下部署的程序、网站运行出错、不正常,先看EventLog。
文本日志:
一般按照日期区分,同时限制单个文件大小,避免单个文件过大。
限制日志总数或者总大小,避免日志把磁盘存满。
1..NET没有内置的文本日志提供者。
2.NLog,NuGet安装:NLog.Extensions.Logging。项目根目录下建立nlog.config。也可以是其他文件名,但是要单独配置。
3.增加logBuilder.AddNLog()
4.https://github.com/NLog/NLog/wiki/Getting-started-with-.NET-Core-2---Console-application
自动拷贝配置文件到out目录:
<ItemGroup>
<None Update="nlog.config" CopyToOutputDirectory="Always" />
</ItemGroup>
日志分类、过滤:
1.为什么要日志分类?不同级别或者不同模块的日志记录到不同的地方。
2.为什么要日志过滤?项目不同阶段(比如刚上线和稳定后)需要记录的日志不同。严重错误可以调用短信Provider等。
NLog 参数:
1.archiveAboveSize为“单个日志文件超过多少字节就把日志存档”,单位为字节,这样可以避免单个文件太大,如果不设定maxArchiveFiles参数,则文件日志存档的数量会一直增加,而如果设定maxArchiveFiles参数后,则最多保存maxArchiveFiles指定数量个数的存档文件,旧的会被删除;也可以不设置maxArchiveFiles参数,而设置maxArchiveDays参数,这样可以设定保存若干天的日志存档。
2.rules节点下可以添加多个logger,每个logger都有名字(name属性),name是通配符格式的。
3.logger节点的minlevel属性和maxlevel属性,表示这个logger接受日志的最低级别和最高级别。
4.日志输出时,会从上往下匹配rules节点下所有的logger,若发现当前日志的分类名和level符合这个logger的name的通配符,就会把日志输出给这个logger。如果匹配多个logger,就把这条日志输出给多个logger。但是如果一个logger设置了final=“true”,那么如果匹配到这个logger,就不继续向下匹配其他logger了。
NLog部分功能和.NET的Logging重复,比如分类、分级、各种Provider。
为了避免冲突,如果用NLog,建议不要再配置.NET的分级等。
结构化日志:
结构化日志比普通文本更利于日志的分析,比如统计“邮件发送失败”错误发生了多少次。
Serilog:
1.NLog也可以配置结构化日志,但是配置麻烦,推荐使用Serilog
2.NuGet安装:Serilog.AspNetCore
3.Log.Logger = new LoggerConfiguration().MinimumLevel.Debug().Enrich.FromLogContext().WriteTo.Console(new JsonFormatter(()).CreateLogger(); 也支持配置文件配置;
4.要记录结构化数据通过占位符来输出:Logger.LogWarning(“新用户”{@person}", new {id=3});
5.同样可以输出到文件、数据库、MongoDB等。
集中化日志:
集群化部署环境中,有N多服务器,如果每个服务器都把日志记录到本地文件,不便于查询、分析。需要把日志保存到几种花的日志服务器中。
可以使用云服务或自建云服务self-hosting:Exceptionless
总结:
1.普通项目用NLog输出到文本文件即可,根据需要设定过滤、分类规则。
2.集群部署的项目用Serilog+集中式日志服务。如果需要吉林结构化日志,再进行结构化输出。
3.如果用云服务的就够了,就用云服务的,免得自己部署;如果想自己控制日志数据就自部署Exceptionless或者ELK等。
ServiceCollection services = new ServiceCollection();
services.AddLogging(builder =>
{
// builder.AddConsole();
// builder.SetMinimumLevel(LogLevel.Trace);
// builder.AddNLog();
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.Enrich.FromLogContext()
.WriteTo.Console(new JsonFormatter())
.CreateLogger();
builder.AddSerilog();
});
services.AddScoped<TestConsoleLogging>();
services.AddScoped<TestLogging>();
using (var sp = services.BuildServiceProvider())
{
var testConsoleLogging = sp.GetService<TestConsoleLogging>();
var testLogging = sp.GetService<TestLogging>();
for (int i = 0; i < 10; i++)
{
testConsoleLogging.Test();
testLogging.Test();
}
}
Top comments (0)