在.Net Core中记录日志
一个完善的系统,必然会有非常完善的日志记录,用户的操作、系统的运行状况等信息被完整的记录下来,方便我们对系统进行维护和改进。.net core 也为日志记录提供了内置的支持。
在控制台程序中记录日志
本段内容摘自《在.NET Core控制台应用程序中使用日志》,作者非常详细的介绍了如何在控制台应用程序中使用内置的日志记录功能。
代码如下:
var configuration = new ConfigurationBuilder()
.AddJsonFile("appsettings.json")
.Build();
var serviceCollection = new ServiceCollection()
.AddLogging(loggingBuilder =>
{
loggingBuilder.AddConfiguration(configuration.GetSection("Logging"));
loggingBuilder.AddConsole(); // 将日志输出到控制台
})
.AddSingleton<ICalculationService, CalculationService>();
var serviceProvider = serviceCollection.BuildServiceProvider();
var calcService = serviceProvider.GetService<ICalculationService>();
Console.WriteLine(calcService.Add(3, 4));
其实,在拿到ServiceProvider对象后,我们就可以获取日志服务了。例如:
var logger = serviceProvider.GetService<ILogger<Program>>();
logger.LogDebug($"系统初始化完成...");
在Asp.Net Core应用中记录日志
由于在IWebHostBuilder.CreateDefaultBuilder()
方法中,系统已经帮我们初始化了日志组件,因此我们可以直接使用ILogger<T>
进行注入。
代码如下:
[Route("api/[controller]")]
[ApiController]
public class WelcomeController : ControllerBase
{
private readonly ILogger<WelcomeController> logger;
public WelcomeController(ILogger<WelcomeController> logger)
{
this.logger = logger;
}
[HttpGet, HttpPost]
public string Welcome()
{
this.logger.LogInformation($"Welcome...");
return "Welcome... ";
}
}
日志类别(LogCategory)
日志类别是在ILogger创建时就需要指定的一个字符串,它用来区分日志的类别。当我们使用ILogger<T>
创建日志对象时,日志类别默认为泛型T的类名。
我们也可以通过ILoggerFactory.CreateLogger
指定日志类别:
private readonly ILogger logger;
public WelcomeController(ILoggerFactory factory)
{
this.logger = factory.CreateLogger("WelcomeLogger");
}
日志等级(LogLevel)
日志等级用来标记日志的重要程度,在.NetCore中,日志等级分为以下几种:
- Trace = 0,记录跟踪信息
- Debug = 1,记录调试信息
- Information = 2,记录常规信息
- Warning = 3,记录警告信息,通常为404等不影响系统正常运行的信息
- Error = 4,记录错误信息,通常为异常信息
- Critical = 5,记录系统错误信息,通常为内存溢出、磁盘写满等
日志事件ID
每条日志都可以指定一个事件ID,事件 ID 与一组事件相关联,用来更加准确的追踪引发日志的事件。例如:
//定义事件ID类
public class LoggingEvents
{
public const int GenerateItems = 1000;
public const int ListItems = 1001;
public const int GetItem = 1002;
public const int InsertItem = 1003;
public const int UpdateItem = 1004;
public const int DeleteItem = 1005;
public const int GetItemNotFound = 4000;
public const int UpdateItemNotFound = 4001;
}
//使用事件ID进行日志记录
_logger.LogWarning(LoggingEvents.GetItemNotFound, "Item NOT FOUND");
日志筛选
日志筛选器可为日志提供程序指定输出日志的最低级别,当大于最低级别时才会被输出或存储。例如我们将最低级别设置为Error,则只有Error或Critical日志才会被展示。
配置文件中设置筛选器
下面的代码展示了一个日志筛选器的配置,并在备注中进行了说明:
{
"Logging": { //日志配置节点
"LogLevel": { //默认筛选器
"Default": "Debug", //默认日志类别
"System": "Information" //日志类别为System
},
"Console": { //针对日志提供程序Console的配置
"LogLevel": { //日志筛选器
"Default": "Error", //默认日志类别
"LoggingSample.Program": "Debug" //日志类别为LoggingSample.Program的筛选器
}
}
}
}
参考文档
在.Net Core中记录日志的更多相关文章
- ASP.NET Core:ASP.NET Core中使用NLog记录日志
一.前言 在所有的应用程序中,日志功能是不可或缺的模块,我们可以根据日志信息进行调试.查看产生的错误信息,在ASP.NET Core中我们可以使用log4net或者NLog日志组件来实现记录日志的功能 ...
- ASP.NET Core中使用Graylog记录日志
以下基于.NET Core 2.1 定义GrayLog日志记录中间件: 中间件代码: public class GrayLogMiddleware { private readonly Request ...
- Asp.Net Core中利用Seq组件展示结构化日志功能
在一次.Net Core小项目的开发中,掌握的不够深入,对日志记录并没有好好利用,以至于一出现异常问题,都得跑动服务器上查看,那时一度怀疑自己肯定没学好,不然这一块日志不可能需要自己扒服务器日志来查看 ...
- 在Asp.Net Core中集成Kafka(中)
在上一篇中我们主要介绍如何在Asp.Net Core中同步Kafka消息,通过上一篇的操作我们发现上面一篇中介绍的只能够进行简单的首发kafka消息并不能够消息重发.重复消费.乐观锁冲突等问题,这些问 ...
- 一行代码在 .NET Core 中快速使用 log4net
原文:一行代码在 .NET Core 中快速使用 log4net 1. .NET Core 控制台程序中使用 第一步:添加引用 Install-Package log4net 第二步:将附件 LogH ...
- .net core中的那些常用的日志框架(Logging篇)
前言 日志,在我们每个项目中是必不可少的,它不仅能在调试的时候测试数据,而且在项目上线,也是我们排查错误的得力助手,那我就能谈谈,用的多的几个日志框架吧!如果有不对的地方,欢迎来指教错误,谢谢! As ...
- .net core中的那些常用的日志框架(Serilog篇)
前言 上文说到Nlog日志框架,感觉它功能已经很强大,今天给大家介绍一个很不错的日志框架Serilog,根据我的了解,感觉它最大的优势是,结构化日志,它输出的日志是Json的格式,如果你使用的是Mon ...
- .NET Core 中的日志与分布式链路追踪
目录 .NET Core 中的日志与分布式链路追踪 .NET Core 中的日志 控制台输出 非侵入式日志 Microsoft.Extensions.Logging ILoggerFactory IL ...
- 如何在 ASP.Net Core 中使用 Serilog
记录日志的一个作用就是方便对应用程序进行跟踪和排错调查,在实际应用上都是引入 日志框架,但如果你的 日志文件 包含非结构化的数据,那么查询起来将是一个噩梦,所以需要在记录日志的时候采用结构化方式. 将 ...
随机推荐
- PostGIS 结合Openlayers以及Geoserver实现最短路径分析(二)
前文讲述了怎么用ArcMap制作了测试数据,并导入了PostGIS,接下来我们需要结合PgRouting插件,对入库的数据再进行一下处理. 1.在pgAdmin中,执行下面的sql语句 --添加起点字 ...
- 网络爬虫一定要用代理IP吗
数据采集现在已经成为大数据时代不可以缺少的一部分,在数据采集过程中,很多人都会用到代理ip,那么网络爬虫一定要用代理IP吗?答案虽然不是肯定的,但出现以下情况一定是需要用到代理IP的.1.在爬虫的时候 ...
- Tomcat安装和使用
1.Tomcat简介 Tomcat是Apache开源组织下的开源免费的中小型Web应用服务器,支持javaEE中的servlet和jsp规范. 2.Windows版安装和使用 下载地址:http:// ...
- Glibc编译报错:*** LD_LIBRARY_PATH shouldn't contain the current directory when*** building glibc. Please change the environment variable
执行glibc编译出错如下图 [root@localhost tmpdir]# ../configure --prefix=/usr/loacl/glibc2.9 --disable-profile ...
- HttpClientFactory 日志不好用,自己扩展一个?
前言 .NetCore2.1新推出HttpClientFactory工厂类, 替代了早期的HttpClient, 并新增了弹性Http调用机制 (集成Policy组件). 替换的初衷还是简单说下: ① ...
- maven本地仓库路径和修改
1.本地仓库,顾名思义,就是Maven在本地存储构件的地方. 注:maven的本地仓库,在安装maven后并不会创建,它是在第一次执行maven命令的时候才被创建 maven本地仓库的默认位置:无论是 ...
- 前端js,如何在结构化与性能中做取舍。
js发展中的问题 随着前端web技术的发展,js要解决的问题也变得越来越多,越来越复杂. 解决更复杂的问题,需要更好的结构. 解决更复杂的问题,也需要更好的性能. 结构的优化在一定程度上会牺牲性能,同 ...
- css6——通栏平均分布
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- 对于Python函数与方法,你可能存在些误解
欢迎添加华为云小助手微信(微信号:HWCloud002 或 HWCloud003),输入关键字"加群",加入华为云线上技术讨论群:输入关键字"最新活动",获取华 ...
- Java修炼——内部类详解
内部类详解 定义:将一个类定义在另一个类的内部,该类就称为内部类 类中定义的内部类特点: 内部类作为外部类的成员,可以直接访问外部类的成员 (包括 private 成员),反之则不行. 内部类做为外部 ...