Asp.net core logging 日志
1 基本概念
Dotnet core 一个重要的特征是 Dependency injection ,中文一般是依赖注入,可以简单理解为一个集合,在应用程序启动时,定义各种具体的实现类型并将其放到集合中;在应用程序运行时,从集合中取出之前放入的类型。
Logging 的实现就采用这种方式,写日志分为两步:创建写日志的对象;用创建的对象写日志。ILoggerProvider 创建写日志的对象 ILogger ,即在应用程序启动时,把实现了 ILoggerProvider 接口的类型放到集合中,在应用程序运行期间,需要写日志,先去集合中取 ILoggerProvider ,使用其创建 ILogger 对象,然后就可以写日志了。
1.1 ILogger
写日志的定义:
void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter);
除了 logLevel 有点熟,其它都感觉无用,只是我们并没有直接使用,并不是其真的无用。
1.2 ILoggerProvider
创建写日志对接定义:
ILogger CreateLogger(string categoryName);
通过定义可以知道,所有的 ILogger 对象都有 categoryName 属性。属性值不能为 Null。
到这里其实可以写日志了,也仅只是写日志而已,还有两个比较重要的问题:1 写的日志在哪里可以看?2 如何管理写日志?
问题1 是由 ILoggerProvider 接口的实现来决定,官方的实现有:Console 、Debug 、EventSource 、EventLog 、TraceSource 、Azure App Service,还有一些第三方实现,如此我们自己也是可以实现的。
例如 ConsoleLoggerProvider 是将日志在命令行中打印出来,如果是控制台程序或者是 self host 启动 web 程序便可以在命令行中看到打印的日志信息。
问题2由 log Level、EventId、Logger Provider、Log filtering、Log category、Log scopes 合作解决。好像是很复杂,其实比较简单。
1.3 Log Level
定义如下,数值越大级别越高。:
Trace = 0
Debug = 1
Information = 2
Warning = 3
Error = 4
Critical = 5
None = 6
例如:
_logger.LogWarning(LoggingEvents.GetItemNotFound, "GetById({ID}) NOT FOUND", id);
日志的 logLevel 是 Warning ,eventId 是的 GetItemNotFound,内容是“GetById({ID}) NOT FOUND”,这个对应接口定义中 formatter 的返回值 string。
2 log filtering 说明
为了说明日志过滤,先说明下日志的整体框架,在应用程序启动时,可以注册多个不同的 ILoggerProvider 实现,而在写日志时,只调用一次写,但所有注册的 ILoggerProvider 都能收到写的日志,这背后是由框架实现的。具体的简单点说,我们调用 log()后,它再遍历所有注册的 ILoggerProvider ,再分别调用它们的 log()方法。
这样在一个正常的系统中会有多个 ILoggerProvider 实现,而每个 ILoggerProvider 创建的 ILogger 又有一个类别 category;也就是说在调用log()写日志时,ILogger 对象具有 Provider 和 Category,这点很重要!
而过滤便是针对 Provider 和 Category 设置的。
2.1 过滤类型
可以为某个 Provider 的某个 Category 设置一条过滤规则,也可以针对所有的Provider 和所有的Category 设置一条过滤规则。
这样过滤规则的类型也就可以如下所示:
表1:
|
Provider 限定 |
Provider 不限定 |
|
|
Category 限定 |
1 |
3 |
|
Category 不限定 |
2 |
4 |
2.2 过滤规则
(1)minimum level
最低级别的意思是框架只会将高于(包括等于)此级别的日志传递给 Provider,进而 Provider 调用 log()方法处理日志。
(2)Filter functions
Func<string, LogLevel, bool> categoryLevelFilter
这是委托签名,入参是类别 Category 名称和写日志的级别,返回是 bool 类型,也就是说可以根据类别和消息级别来决定是否写日志。
2.3 最佳过滤规则
至此,我可以可以添加一条过滤规则,其签名如下:
LoggerFilterRule(string providerName, string categoryName, LogLevel? logLevel, Func<string, string, LogLevel, bool> filter)
比如:.AddFilter<ConsoleLoggerProvider>("System", LogLevel.Critical) 便等同于:
LoggerFilterRule("ConsoleLoggerProvider", "System", LogLevel.Critical,null)
如果我们添加了多条过滤规则,但每个 Provider 只能对应一条过滤规则,这时应当使用以下规则:
(1)1>2>3>4 (参考表1)
(2)同一等级后注册高于先注册
(3)无可用过滤规则,则不过滤
补充,在设置过滤规则时可以同时设置 minimum level 和 Filter functions,先执行minimum level,如有必要再执行 Filter functions。
在匹配类别 Category 时,不是字符串相同比较,是字符串前缀包含即可。
正常的系统,对象间关系简单示意如下:

图1
3 配置示例
设置过滤规则有两种方式:代码和配置文件
3.1 代码
ILoggingBuilder AddFilter<T>(this ILoggingBuilder builder, string category, LogLevel level)
还有一些类似的签名,T 是 Provider 类型,可选, category 必选。可以实现表1中:1、2、3类型设置,4类型没有找到(应该是没有提供)
3.2 配置文件
{
"Logging": {
"LogLevel": {
"Default": "Trace",
"Microsoft": "Critical"
},
"Console": {
"LogLevel": {
"Default": "Debug",
"System": "Warning"
}
}
}
}
这是一实例配置,从上往下定义了4个过来规则,其对应的表1中的级别分别是:4、3、2、1
4 实践一下
(1)注册 Provider
(2)注册 Filter
(3)获取 ILogger
(4)写日志
我没有贴代码,请参考下面的git中的SampleApp。
5 参考
https://docs.microsoft.com/en-us/aspnet/core/fundamentals/logging/?view=aspnetcore-2.1
https://github.com/aspnet/Logging
Asp.net core logging 日志的更多相关文章
- 如何利用Serilog的RequestLogging来精简ASP.NET Core的日志输出
这是该系列的第一篇文章:在ASP.NET Core 3.0中使用Serilog.AspNetCore. 第1部分-使用Serilog RequestLogging来简化ASP.NET Core的日志输 ...
- Elasticsearch,Kibana,Logstash,NLog实现ASP.NET Core 分布式日志系统
Elasticsearch - 简介 Elasticsearch 作为核心的部分,是一个具有强大索引功能的文档存储库,并且可以通过 REST API 来搜索数据.它使用 Java 编写,基于 Apac ...
- ASP.NET Core Logging in Elasticsearch with Kibana
在微服务化盛行的今天,日志的收集.分析越来越重要.ASP.NET Core 提供了一个统一的,轻量级的Logining系统,并可以很方便的与第三方日志框架集成.我们也可以根据不同的场景进行扩展,因为A ...
- ASP.NET Core学习日志1
1.ASP.NET进行了结构化的优化,使框架更为精简,模块化更加明显. 2.ASP.NET Core不再基于System.Web.dll,而是基于细粒度.分解的NuGet包. 3.基础特性: 1.We ...
- ASP.NET Core Logging Solution
Serilog.Extensions.Logging.File This package makes it a one-liner - loggerFactory.AddFile() - to con ...
- ASP.NET Core分布式日志系统ELK实战演练
一.ELK简介 ELK是Elasticsearch.Logstash和Kibana首字母的缩写.这三者均是开源软件,这三套开源工具组合起来形成了一套强大的集中式日志管理平台. • Elastics ...
- ASP.NET Core可视化日志组件使用
前言 今天站长推荐一款日志可视化组件LogDashboard,可以不用安装第三方进程,只需要在项目中安装相应的Nuget包,添加数行代码,就可以实现拥有带Web页面的日志管理面板,十分nice哦. 下 ...
- ASP.NET Core 添加日志NLog
1.在Nuget上搜索 NLog.Extensions.Logging 安装最新版 2.添加日志配置文件,在项目指定目录下添加配置文件nlog.config,内容添加如下: <?xml vers ...
- Asp.net Core 异常日志与API返回值处理
需求: 1.对异常进行捕获记录日志 并且修改返回值给前端 解释: ILogger4是自定义的一个日志,更改它就好 解决方案1: 使用中间件进行异常捕获并且修改其返回值 public class Err ...
随机推荐
- 更安全的rm命令,保护重要数据
更安全的rm命令,保护重要数据 网上流传的安全的rm,几乎都是提供一个rm的"垃圾"回收站,在服务器环境上来说,这实非良方. 我想,提供一个安全的rm去保护一些重要的文件或目录不被 ...
- restful 架构风格的curd(增删改查)
restful架构 概念:REST指的是一组架构约束条件和原则,如果一个架构符合REST的约束条件和原则,就称之为RESTful架构. restful不是一个专门的技术,他是一个规范.规范就是写写代码 ...
- Bootstrap初识
目录 概述 快速入门 响应式布局 CSS样式和JS插件 全局CSS样式 组件 插件 案例:黑马旅游网 概述 概念:一个前端开发的框架,Bootstrap是美国Twitter公司的设计师Mark Ott ...
- LeetCode--LinkedList--83.Remove Duplicates from Sorted List(Easy)
题目地址https://leetcode.com/problems/remove-duplicates-from-sorted-list/ 83. Remove Duplicates from Sor ...
- STM32学习笔记——GPIO
单片机型号STM32F407VET6. 概述 GPIO的分类: 可接受5V输入的(FT),绝大多数引脚都是: 只能接受3.3V输入的(TTa),只有PA4和PA5,就是DAC输出的两个引脚: 其他,包 ...
- Nacos下动态路由配置
前言 Nacos最近项目一直在使用,其简单灵活,支持更细粒度的命令空间,分组等为麻烦复杂的环境切换提供了方便:同时也很好支持动态路由的配置,只需要简单的几步即可.在国产的注册中心.配置中心中比较突出, ...
- Openwrt:mtd/mtd_write烧写固件
文章目录 1 查看当前系统分区信息 2 备份固件firmware 3 恢复固件firmware 4 备份恢复Openwrt路由器配置 5 恢复Openwrt路由器默认设置 6 刷新路由器固件 比较简单 ...
- c++11 符号修饰与函数签名、函数指针、匿名函数、仿函数、std::function与std::bind
一.符号修饰与函数签名 1.符号修饰 编译器将c++源代码编译成目标文件时,用函数签名的信息对函数名进行改编,形成修饰名.GCC的C++符号修饰方法如下: 1)所有符号都以_z开头 2)名字空间的名字 ...
- Spring Cloud 系列之 Config 配置中心(三)
本篇文章为系列文章,未读前几集的同学请猛戳这里: Spring Cloud 系列之 Config 配置中心(一) Spring Cloud 系列之 Config 配置中心(二) 本篇文章讲解 Conf ...
- [hdu5316]线段树
题意:给一个array,有两种操作,(1)修改某一个位置的值,(2)询问区间[L,R]内的最大子段和,其中子段需满足相邻两个数的位置的奇偶性不同 思路:假设对于询问操作没有奇偶性的限制,那么记录区间的 ...