DEV Community

Alex
Alex

Posted on

.NET Learning Notes: 日志系统(Logging)

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>
Enter fullscreen mode Exit fullscreen mode

日志分类、过滤:
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();

    }
}
Enter fullscreen mode Exit fullscreen mode

Hostinger image

Get n8n VPS hosting 3x cheaper than a cloud solution

Get fast, easy, secure n8n VPS hosting from $4.99/mo at Hostinger. Automate any workflow using a pre-installed n8n application and no-code customization.

Start now

Top comments (0)

Qodo Takeover

Introducing Qodo Gen 1.0: Transform Your Workflow with Agentic AI

Rather than just generating snippets, our agents understand your entire project context, can make decisions, use tools, and carry out tasks autonomously.

Read full post