3.3.1 .NET Core日志基本使用
书中介绍了把日志输出到控制台的使用方式:
安装 Microsoft.Extensions.Logging 和 Microsoft.Extensions.Logging.Console
日志记录代码:
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
ServiceCollection services = new ServiceCollection();
//将与日志相关的服务注册到容器中 ,AddConsole将日志输出到控制台
services.AddLogging(logBuilder => { logBuilder.AddConsole(); });
using (var sp=services .BuildServiceProvider())
{
var logger = sp.GetRequiredService<ILogger<Program>>();
logger.LogWarning("警告信息:八嘎呀路!");
logger.LogError("错误信息:内蒙古海军上校詹姆斯下士于玉菊!");
logger.LogInformation("正常日志信息:Chinese东北东四省:黑龙江、吉林、辽宁、日本");
Console.ReadKey();
}
调试运行结果:
3.3.2 文件日志提供程序 NLog
杨老师在随书视频教程中讲了NLog的应用,我之前也自己用过NLog并有相关的应用教程:
.NET 日志记录 NLog包的使用_net nlog-CSDN博客
.Net记录日志的方式有多种,比如
System.Diagnostics.Trace 可以通过 System.Diagnostics.Trace
类记录调试和错误信息。它支持不同的监听器(例如:控制台、文件、事件日志等)来接收日志输出。
NLog NLog 是一个灵活且功能强大的开源日志库,支持多种日志级别和多种目标(如文件、数据库、邮件等)。
Serilog Serilog 是另一个强大的日志库,支持结构化日志,可以方便地记录复杂数据结构。
Log4Net Log4Net 是 Apache 提供的日志库,功能全面且使用广泛,适用于各种应用程序。
本文主要介绍NLog的使用
1. 安装NLog
在NuGet程序管理中搜索NLog,点击安装
或者使用 NuGet 包管理器控制台命令:
Install-Package NLog
在 【视图】-【其他窗口】-【程序包管理器控制台】,在控制台中输入Install-Package NLog进行安装。
2. 配置
在项目中添加config文件
编辑配置文件
<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<targets>
<!-- 将日志写入 date-based 文件 -->
<target xsi:type="File" name="fileTarget"
fileName="logs/log_${shortdate}.txt"
layout="${longdate}|${level:uppercase=true}|${logger}|${message}"
archiveEvery="Day" <!-- 每天生成新的日志文件 -->
archiveNumbering="Date" <!-- 归档文件根据日期命名 -->
maxArchiveFiles="7" <!-- 最多保留 7 个归档文件 -->
/>
<!-- 将日志输出到控制台 -->
<target xsi:type="Console" name="consoleTarget"
layout="${longdate}|${level:uppercase=true}|${logger}|${message}" />
</targets>
<rules>
<!-- 记录所有等级的日志到文件 -->
<logger name="*" minlevel="Debug" writeTo="fileTarget" />
<!-- 记录错误及以上级别的日志到控制台 -->
<logger name="*" minlevel="Error" writeTo="consoleTarget" />
</rules>
</nlog>
配置说明:
fileName="logs/log_${shortdate}.txt"
:使用${shortdate}
占位符,NLog 会自动将其替换为当前日期(格式为 yyyy-MM-dd),从而生成每天新的日志文件,如logs/log_2023-10-09.txt
。archiveEvery="Day"
:这个设置会让 NLog 每天在日志轮转时创建一个新的日志文件。archiveNumbering="Date"
:归档文件将以日期编号,这样每个归档文件都将带有相应的日期。maxArchiveFiles="7"
:最多保留 7 个归档文件,超过这个数量的文件将被删除。
3.应用
class Program
{
// 创建一个 logger 实例
private static readonly Logger logger = LogManager.GetCurrentClassLogger();
static async Task Main(string[] args)
{
try
{
logger.Debug("调试日志");
logger.Info("程序开始运行");
Class1 class1 = new Class1();
// 可能会发生异常的代码
throw new Exception("一个示例异常65265");
}
catch (Exception ex)
{
// 记录异常信息
logger.Error( ex.Message);
}
finally
{
// 确保最后记录一些结束信息
logger.Info("程序结束");
}
}
}
4. 其他详情
4.1 关于rules
在 NLog 配置文件中的 <rules>
部分,name="*"
表示日志记录器的名称匹配所有的日志记录器。具体来说:
*
是一个通配符,表示匹配任何名称的日志记录器。这意味着这一规则适用于所有类别的日志(无论是哪个类、命名空间或组件所记录的日志)。
<logger name="*" minlevel="Debug" writeTo="fileTarget" />
这条规则的意思是:所有名称的日志记录器(即所有的日志消息)都会被记录到指定的 fileTarget
目标中,条件是日志级别大于或等于 Debug
。换句话说,Debug、Info、Warn、Error 和 Fatal 等级的日志都会被写入到文件中。
<logger name="*" minlevel="Error" writeTo="consoleTarget" />
这条规则的意思是:所有名称的日志记录器都会将日志级别大于或等于 Error
的消息输出到控制台。这意味着只有 Error 和 Fatal 等级的日志才会在控制台上显示。
4.2 关于日志的等级
NLog 日志等级用于指示日志消息的严重性,并帮助开发者过滤和查找日志信息。NLog 支持以下几种日志等级(从最低到最高):
-
Trace:用于跟踪代码的执行流程和详细的调试信息。适合开发阶段使用,通常用于记录非常详细的消息。
-
Debug:用于调试目的的详细信息,通常用于开发和测试阶段。帮助开发者理解程序的内部运作。
-
Info:用于常规的信息性消息,表示程序的正常运行状态。例如,记录用户操作、系统事件等。
-
Warn:用于警告性消息,表示可能的潜在问题,但不会影响程序的正常运行。例如,某些依赖项不可用,但程序仍然可以继续运行。
-
Error:用于记录错误消息,表示程序运行中发生了异常。通常需要关注,以便后续进行错误处理。
-
Fatal:用于重大错误消息,表示系统无法继续运行。通常指的是严重的运行时错误,导致程序崩溃或无法恢复的状态。
日志等级排序
这几种日志等级的排序从低到高,如下:
- Trace
- Debug
- Info
- Warn
- Error
- Fatal
3.3.3 集中式日志
长话短说:在分布式环境中,为了方便管理日志,最好采用集中式的日志服务器,各个服务器都把产生的日志写入专用的日志服务器。
杨老师推荐了两个集中式日志的开源项目:Exceptionless和ELK。
ELK是目前非常流行的开源集中式日志分析系统之一,不过由于ELK是Java开发的,因此对于不熟悉Java的同志不太友好,所以推荐使用Exceptionless ,Exceptionless的开发人员主推他们的日志云服务,不用自己搭建服务器,而是直接购买他们的云服务,然后程序直接把日志发送给他们的服务器即可。
巴拉巴拉说了一堆,最后的建议是:他俩的服务器都在境外,访问比较缓慢,因此一般都是自己选择开源的集中式日志系统进行部署日志服务器。
3.4 第三章小结
本章介绍了依赖注入、配置系统和日志这3个模块。依赖注入可以让程序组件以低耦合的
形式组装在一起;配置系统允许我们通过命令行、环境变量、配置文件甚至自定义配置源来进
行系统的配置,多配置源的机制能让我们更灵活地对系统进行配置;使用日志功能,可以把日
志信息按照不同的级别输出,也可以在不改变业务代码的前提下,对于日志的输出进行灵活的
定制。