日志系统

你就像太阳,发光又不失温暖。 --zhu
日志系统
1、日志级别:Trace<Bebug<Information<Warning<Error<Critical
2、日志提供者(LoggingProvider):把日志输出到哪里。控制台、文件、数据库等。
3、.NET的日志非常灵活,对于业务代码只要注入日志对象记录日志即可,具体哪些日志输出到哪里,什么格式,是否输出等都有配置或者初始化代码决定。

文本日志
1、文本日志一般按照日期区分。
2、如何避免文本日志把磁盘撑爆?限制日志总个数或者总大小。
3、如何避免一个日志文件太大?ICBC故事。限制单个文件大小。

NLOG
1、.NET没有内置文本日志提供者。第三方有Log4Net、NLog、Serilog等。老牌的Log4Net另搞一套,更适合framework,不考虑。
2、NLog,NuGet安装:NLog.Extensions.Logging(using NLog.Extensions.Logging;)。项目根目录下建nlog.config,注意文件名的大小写(考虑linux)。也可以是其他文件名,但是需要单独配置。约定大于配置。
3、增加logBudilder.AddNLog()。

日志分类、过滤
1、为什么要日志分类?不同级别或者不同模块的日志记录到不同的地方。
2、为什么要日志过滤?项目不同阶段(比如刚上线和稳定后)需要记录的日志不同。严重错误可以调用短信Provider等。
3、搞一个新的类,放到systemServices这个命名空间下,然后输出一些日志。然后调用很多次日志执行的代码。

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

rules
1、rules节点下可以添加多个logger,每个logger都有名字(name属性),name是通配符格式的。
2、logger节点的minlevel属性和maxlevel属性,表示这个logger接受日志的最低级别和最高级别。
3、日志输出时,会从上往下匹配rules节点下所有的logger,若发现当前日志的分类名符号这个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 JsonFormatte())
.CreateLogger();

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

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

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

总结
1、普通项目用NLog输出到文本文件即可,根据需要设定过滤,分类规则。
2、集群部署的项目用Serilog+“集中式日志服务”。如果需要记录结构化日志。再进行结构化输出。
3、如果云服务的满足需求,就用云服务,不用自己部署。如果想自己控制日志数据,用自部署Exceptionless或者ELK(难度大)等。

posted on 2024-07-11 11:21  小脑虎爱学习  阅读(1)  评论(0编辑  收藏  举报