• .NET 日志系统


    基本概念

    1.日志级别:Trace<Debug<Information<Warning<Error<Critical

    2.日志提供者(LoggingProvider):把日志输出到哪里。控制台、文件、数据库等。

    3.。NET等日志非常灵活,对于业务代码只要注入日志对象记录日志即可,具体哪些日志输出到哪里、什么样的格式、是否输出等都有配置或者初始化代码决定。

    输出到控制台

    1.NuGet:Microsoft.Extensions.Logging 日志基础包

    、Microsoft.Extensions.Logging.Console 往控制台输出包

    2.DI注入:

    services.AddLogging(logBuilder=>{

         logBuilder.AddConsole();//可多个Provider

    })

    3.需要记录日志的代码,注入ILogger<T>即可,T一般就用当前类,这个类的名字会输出到日志,方便定位错误。然后调用LogInformation()、LogError()等方法输出不同级别的日志,还支持输出异常对象。

    其他日志提供者

     1.Console只适合开发阶段,why?运行阶段需要输出到文件等。

    2.采用和Configuration类似的扩展机制,不仅内置了Debug、事件查看器、文件、Azure日志等提供者,还可以扩展。Provider可以共存。

    3.EventLog:Windows Only。在Windows下部署的程序、网站运行错误、不正常,先去EventLog看看。

    NuGet安装:

    Microsoft.Extensions.Logging.EventLog。然后logBuilder.AddEventLog()。

    文本日志

    1.为什么文本日志一般按照日期区分?

    2.如何避免文本日志把磁盘撑爆?限制日志总个数或者总大小。

    3.如何避免一个日志文件太大的问题?ICBC故事。限制单个文件大小。

    NLOG

    1. .NET没有内置文本日志提供者。第三方有Log4Net、NLog、Serilog等。老牌的Log4Net另搞一套,不考虑。

    2.NLog,NuGet安装:NLog.Extensions.Logging  (using NLog.Extensions.Logging;)。项目根目录下建nlog.config,注意文件名单大小写(考虑linux)。也可以说其他文件名,但是需要单独配置。约定大于配置。

    3.增加logBuilder.AddNLog()

    日志分类、过滤

    1.为什么要日志分类?不同级别或者不同模块的日志记录到不同的地方。

    2.为什么要日志过滤?项目不同阶段(比如刚上线和稳定后)需要记录的日志不同。严重错误可以调用短信Provider等。

    3.搞一个新的类,放到SystemServices这个命名空间下,然后输出一些日志。然后调用很多次日志执行的代码。nlog.config如备注所改。archiveAboveSize等参数的意义见下一页。

    参数解读

    1.archiveAboveSize为“单个日志文件超过多个字节就把日志存档”,单位为字节,这样可以避免单个文件太大,如果不设定maxArchiveFiles参数,则文件日志存档文件数量会一直增加,而如果设定maxArchiveFiles参数后,则最多保存maxArchiveFiles指定数量个数的存档文件,旧的会被删掉;当然也可以不设置maxArchiveFiles参数,而设置maxArchiveDays参数,这样可以设定保存若干天地日志存档。

    2.这些不同参数的起到什么作用?“滚动日志”策略。

    rules

    1.rules节点下可以添加多个logger,每个logger都有名字(name属性),name是通配符格式的。

    2.logger节点的minlevel属性和maxlevel属性,表示这个logger接受日志的最低级别和最高级别。

    3.日志输出时,会从上往下匹配rules节点下所有的logger,若发现当前日志的分类名和level符合这个logger的name的通配符,就会把日志输出给这个logger。如果匹配多个logger,就把这条日志输出给多个logger。但是如果一个logger设置了final=“true”,那么如果匹配到这个logger,就不继续向下匹配其他logger了。

    NLog其他

    1.NLog部分功能和.NET的Logging重复,比如分类、分级、各种Provider。

    2.为了避免冲突,如果用NLog,建议不要再配置.NET的分级等(具体用法见微软文档)。

    结构化日志

    结构化日志比普通文本更利于日志的分析,比如统计“邮件发送失败”错误发生了多少次。

    集中化日志

    集群化部署环境中,有N多服务器,如果每个服务器都把日志记录到本地文件,不便于查询、分析。需要把日志保存到集中化的日志服务器中。

    Serilog

    1.NLog也可以配置结构化日志,不过配置麻烦,推荐用Serilog。

    2.NuGet安装:Serilog.AspNetCore。

    3.Log.Logger=new LoggerConfiguration()

    .MinimumLevel.Debug()

    .Enrich.FromLogContext()

    .WriteTo.Console(new JsonFormatter())

    .CreateLogger();

    builder.AddSerilog();

    4.要记录到结构化数据通过占位符来输出:

    logger.LogWarning("新增用户{@person}",new {Id=3,Name="xy"});

    5.同样可以输出到文件、数据库、MongoDB等。

    集中日志服务

    1.使用NLog、Serilog等可以把日志记录到数据库、MongoDB等地方,就可以实现“结构化、集中日志服务”,不过需要自己编写日志分析程序。

    2.公有云厂商一般都有提供了日志服务器,都带分析功能,都有对应Serilog插件,即使没有提供,开发一个插件也不麻烦。

    3.如果没有用云平台或者想自己控制日志服务,可以使用Exceptionless或者ELK等。

    4.Exceptionless、ELK即提供了现成的云服务,也提供了自己部署(Selt Hosting)的模式。由于网速等原因,云服务不符合中国的要求,不过可以试用一下,看是否满足要求,再自己部署。

    Exceptionless

    1.到Exceptionless官网注册、登录后,新建一个项目,按照向导输入公司名字、项目名字后,网站就会给出一个apiKey

    2.项目NuGet安装Serilog的Exceptionless插件:Serilog.Sinks.Exceptionless.

    3.在程序的最开始加上一句ExceptionlessClient.Default.Startup("拿到的apiKey"),然后Serilog的配置中加上一句:.WriteTo.Exceptionless()

    总结

    1.普通项目用NLog输出到文本文件即可,跟根据需要设定过滤、分类规则。

    2.集群部署的项目用Serilog+“集中式日志服务”。需要记录机构化日志,再进行结构化输出。

    3.如果用云服务的就够了,就用云服务的,免得自己部署;如果想自己控制日志数据就用自部署Exceptionless或者ELK(难度大)等。

  • 相关阅读:
    12/18随笔周记
    12/11博客
    12/5周期
    页面管理———页边距
    页面管理
    开发周记
    Echarts图表在VUE项目中使用动态数据源
    VUE.js项目中控制台报错: Uncaught (in promise) NavigationDuplicated解决方法
    Maven工程中web项目提示The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path错误
    Java运算符(i++与++i)
  • 原文地址:https://www.cnblogs.com/roper/p/14982154.html
Copyright © 2020-2023  润新知