P3-3 日志
日志
.NET Core日志的基本使用
- 日志是程序运行中的“黑匣子”,在程序出现问题以后,我们可以通过分析日志来查找问题
- 类似于飞机的黑匣子一样,黑匣子中含有机长等人的语音,飞机运行状态警告等等信息。
什么是日志
基本概念
- 1、日志级别:Trace < Debug < Information < Warning < Error < Critical(重要程序依次从右到左)
- 6种级别,根据个人的使用习惯去使用。
- 一般不会全部用到,像杨中科老师一般都使用
Debug
、Warning
、Error
这三种 Debug
:一般的信息Warning
:连接重试的信息等Error
:代码逻辑错误的信息等
- 一般不会全部用到,像杨中科老师一般都使用
- 6种级别,根据个人的使用习惯去使用。
- 2、日志提供者(LoggingProvider):把日志输出到哪里。控制台、文件、数据库等。
- 3、.NET的日志非常灵活,对于业务代码只要注入日志对象记录日志即可,具体哪些日志输出到哪里、什么样的格式、是否输出等都有配置或者初始化代码决定。
输出到控制台
- 1、NuGet:
Microsoft.Extensions.Logging
:日志Log基础框架Microsoft.Extensions.Logging.Console
:日志输出控制台需要的包
- 2、DI注入:
1
2
3services.AddLogging(logBuilder=> {
logBuilder.AddConsole(); //可多个Provider
}); - 3、需要记录日志的代码,注入
ILogger<T>
即可,T一般就用当前类,这个类的名字会输出到日志,方便定位错误。然后调用LogInformation()、LogError等方法输出不同级别的日志,还支持输出异常对象。
其他日志提供者
- 1、Console只适合开发阶段,why?运行阶段需要输出到文件等。
- 2、采用和Configuration类似的扩展机制,不仅内置了Debug、事件查看器、文件、Azure日志等提供者,还可以扩展。Provider可以共存。
- 3、Event Log:Windows Only。
- 这个方法知道就好,不太建议使用;因为只能在Wiondows上使用,不能跨平台
- 在Windows下部署的程序、网站运行出错、不正常,先去EventLog看看。
- NuGet安装:Microsoft.Extensions.Logging.EventLog。然后logBuilder.AddEventLog()。
- 这个我在
2024-09-12
的时候去用,报错“EventLog access is not supported on this platform” - 也不纠结了,了解就好
- 这个我在
文件日志提供程序NLog
文件日志
- 一般运维人员更喜欢文本日志,这样可以拷贝到自己的电脑上去慢慢排查
- 1、为什么文本日志一般按照日期区分?
- 避免单个文件过大,排查问题困难
- 2、如何避免文本日志把磁盘撑爆?
- 限制日志总个数或者总大小。(一般都是两者都限制,比如总个数不超过100个,一个文本大小不超过100M)
- 3、如何避免一个日志文件太大的问题?
- 银行业务的故事
- 其中一个系统的日志,一天就生成一个,一个日志文件能有6-7个G那么大。(业务量很大)
- 还不能把日志文件拷贝到电脑上,因为银行的特殊性
- 这种情况最好通过限制单个文件大小去降低排查的困难性
NLog
初步使用
- 1、.NET没有内置文本日志提供者。
- 第三方有Log4Net、NLog、Serilog等。老牌的Log4Net另搞一套,不考虑。
- 这一次我们先用NLog去演示
- 2、NLog
- NuGet安装:NLog.Extensions.Logging(using NLog.Extensions.Logging;)。
- 项目根目录下建
nlog.config
,注意文件名的大小写(考虑linux)。也可以是其他文件名,但是需要单独配置。- 可以把
c:\temp\
删除,日志会在程序目录下生成
- 可以把
约定大于配置
。内容见备注。讲解一下配置文件。- rules:规则
- targets:都是文件格式
- 3、增加logBuilder.AddNLog()
日志分类、过滤
- 1、为什么要日志分类?
- 不同级别或者不同模块的日志记录到不同的地方。
- 比如登录注册、下单、出库等
- 不同级别或者不同模块的日志记录到不同的地方。
- 2、为什么要日志过滤?
- 项目不同阶段(比如刚上线和稳定后)需要记录的日志不同。严重错误可以调用短信Provider等。
- 项目初期也许会用需要
Debug
级别的日志,等稳定之后也许就不需要了~
- 项目初期也许会用需要
- 项目不同阶段(比如刚上线和稳定后)需要记录的日志不同。严重错误可以调用短信Provider等。
- 3、搞一个新的类,放到SystemServices这个命名空间下,然后输出一些日志。然后调用很多次日志执行的代码。nlog.config如备注所改。
1 |
|
参数解读
- 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、用下面的代码来进行使用
1
2
3
4
5
6Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.Enrich.FromLogContext()
.WriteTo.Console(new JsonFormatter())
.CreateLogger();
builder.AddSerilog(); - 4、要记录的结构化数据通过占位符来输出
logger.LogWarning(“新增用户 {@person}”,new { Id=3,Name=”zack”});
1 |
|
- 5、同样可以输出到文件、数据库、MongoDB等。
集中日志服务
- 1、使用NLog、Serilog等可以把日志记录到数据库、MongoDB等地方,就可以实现“结构化、集中日志服务”,不过需要自己编写日志分析程序。
- 2、公有云厂商一般都提供了日志云服务,都带分析功能,都有对应Serilog插件,即使没有提供,开发一个插件也不麻烦。
- 3、如果没有用云平台或者想自己控制日志服务,可以使用
Exceptionless
或者ELK
等。 - 4、 Exceptionless、ELK即提供了现成的云服务,也提供了自己部署(Self Hosting)的模式。由于网速等原因,云服务不符合中国的要求,不过可以试用一下,看是否满足要求,再自己部署。
- 可以都先试用一下,选择其一后,然后在进行自部署
Exceptionless
- 1、到Exceptionless官网注册、登录后,新建一个项目,按照向导输入公司名字、项目名字后,网站就会给出一个apiKey
- 2、项目NuGet安装Serilog的Exceptionless插件:
Serilog.Sinks.Exceptionless
。 - 3、在程序的最开始加上一句ExceptionlessClient.Default.Startup(“拿到的apiKey”),然后Serilog的配置中加上一句:.WriteTo.Exceptionless()
- 4、运行结果
总结
- 1、普通项目用NLog输出到文本文件即可,根据需要设定过滤、分类规则。
- 2、集群部署的项目用Serilog+“集中式日志服务”。如果需要记录结构化日志,再进行结构化输出。
- 强烈建议都用Serilog来结构化日志,这样后面转集中化日志也简单
- 3、如果用云服务的就够了,就用云服务的,免得自己部署;
- 如果想自己控制日志数据就用自部署Exceptionless或者ELK(难度大)等。
- 到底选择哪一个,具体还是得看哪一个功能更加适合你们公司
- 不必因为部署难度去选择简单的~
- 4、有经验的程序员/架构师会根据自己公司的业务需求,从很多的软件/框架中来搭配出更加适合公司需求的~
- 解决方案的能力很重要
第3章小结
本章介绍了依赖注入、配置系统和日志这3个模块。
- 依赖注入
- 可以让程序组件以低耦合的形式组装在一起
- 配置系统
- 配置系统允许我们通过命令行、环境变量、配置文件甚至自定义配置源来进行系统的配置
- 多配置源的机制能让我们更灵活地对系统进行配置
- 日志
- 使用日志功能,可以把日志信息按照不同级别的输出,也可以在不改变业务代码的前提下,对于日志的输出进行灵活的定制
P3-3 日志
http://example.com/2024/09/13/Net Core2022教程/第3章:.NET Core核心基础组件/P3-3 日志/