跟我一起学.NetCore之日志作用域及第三方日志框架扩展
前言
上一节对日志的部分核心类型进行简单的剖析,相信现在再使用日志的时候,应该大概知道怎么一回事了,比如记录器是怎么来的,是如何将日志内容写入到不同目的地的等;当然还有很多细节没深入讲解,抽时间小伙伴们可以去研究研究;废话不多说,接下来主要举例演示日志作用域及第三方日志框架的扩展;
正文
说到日志作用域,相信很多小伙伴听着不是那么熟悉吧,之前进行日志记录时候,是不是把内容记录下来就完事了,最多就是再稍微格式化一下;如果是这样,那在排查问题的时候肯定差不多是这样:一点一点的扒日志,然后根据关键词找大概地方,再根据时间和内容定位排错,更让人头大的是哪些日志是在同一个业务中产生的,哪些日志是在同一个请求中记录的等等一系列烦恼;对于复杂的流程日志关联时扒日志就更需要靠眼力了;
而日志作用域可以辅助排查和定位,所谓日志作用域,我是这么理解的,就是将日志记录画一个范围,对应的业务逻辑记录在指定的范围内,这样在排查业务逻辑的时候就减少对业务日志的归属分辨,从而快速定位对应请求或业务的相关日志内容;别那么多废话,上例子......
来吧,一个WebAPI项目走起...

运行,然后嗖嗖嗖嗖按F5刷新几次,如下:

懵了吧,很难辨别出哪些日志内容是同一个请求记录的吧,那排错分析就更加模糊了,就算日志加一些特殊的关键字区分,那排查效率也不高,对吧;其实对于请求而言,框架内部已经实现了,只需要配置开启即可:

其他不动,运行项目,然后嗖嗖嗖嗖按F5刷新几次,如下:

咋多了那么东西,每一次记录,都把对应的请求ID等信息带上了,可以清楚的看到日志是哪个请求的,其他信息而对于日志分析框架来说是很有用的;以上只是举例控制台输出案例,其他目的地也可以进行配置;
到这里肯定会有小伙伴问,那我一次请求里面有多个业务,咋区分呢?那先来稍微改一下代码,增加了一个Action方法:

运行,再刷新

通过BeginScope可以开启一个新的记录作用域,根据对应业务进行记录即可;这里的源码实现就不具体说了,上一节简单提了一下,如果需要详细研究,可以私下继续看看源码;
由于框架本身内置的日志记录,有时候满足不了项目需求,比如需要将日志内容写入到其他目的地,日志内容格式需自定义等,当然这些通过自己也可以实现,只要实现核心类型即可;但是成熟的第三方框架已经很多了,如NLog,Log4Net,Serilog等,别人已经把轮子造好了,咱们直接拿来用岂不美哉;
由于之前在博客里写过一篇集成Log4Net的文章(去博客园吧https://www.cnblogs.com/zoe-zyq/p/12900636.html),这里就举例演示一下集成Serilog吧,三步走:
安装依赖包;

配置文件;
其实可以单独做一个文件配置,但这里和appsettings写在一块了;

代码编写;

其他逻辑不用变,原来记录日志的方式已经委托给Serilog框架进行日志记录了;

以上只是对Serilog简单的配置和使用,如需详细了解,请进入官网https://github.com/serilog/serilog/wiki/Configuration-Basics,文档很全,说的也很详细;
总结
对于日志的使用就简单说到这吧,这节说的内容不多,也比较简单,但有以下几个建议:
日志最好结构化存储,便于检索和分析;
日志针对负责复杂即又关键的业务,最好加上作用域标识;
日志记录时避免记录敏感信息;
日志记录时推荐以模板的形式进行记录;
// 模板形式,推荐
_logger.LogInformation("TestLogger {content}", DateTime.Now);
// 不推荐
_logger.LogInformation($"TestLogger {DateTime.Now}", DateTime.Now)
下一节说说中间件~~~
------------------------------------------------
一个被程序搞丑的帅小伙,关注"Code综艺圈",识别关注跟我一起学~~~

跟我一起学.NetCore之日志作用域及第三方日志框架扩展的更多相关文章
- Go中的日志及第三方日志包logrus
有别的语言使用基础的同学工作中都会接触到日志的使用,Go中自然也有log相关的实现.Go log模块主要提供了3类接口,分别是 "Print .Panic .Fatal ",对每一 ...
- 跟我一起学.NetCore之日志(Log)模型核心
前言 鲁迅都说:没有日志的系统不能上线(鲁迅说:这句我没说过,但是在理)!日志对于一个系统而言,特别重要,不管是用于事务审计,还是用于系统排错,还是用于安全追踪.....都扮演了很重要的角色:之前有很 ...
- Asp.NetCore源码学习[2-1]:日志
Asp.NetCore源码学习[2-1]:日志 在一个系统中,日志是不可或缺的部分.对于.net而言有许多成熟的日志框架,包括Log4Net.NLog.Serilog 等等.你可以在系统中直接使用这些 ...
- 跟我一起学.NetCore之MVC过滤器,这篇看完走路可以仰着头走
前言 MVC过滤器在之前Asp.Net的时候就已经广泛使用啦,不管是面试还是工作,总有一个考点或是需求涉及到,可以毫不疑问的说,这个技术点是非常重要的: 在之前参与的面试中,得知很多小伙伴只知道有一两 ...
- .NetCore中的日志(1)日志组件解析
.NetCore中的日志(1)日志组件解析 0x00 问题的产生 日志记录功能在开发中很常用,可以记录程序运行的细节,也可以记录用户的行为.在之前开发时我一般都是用自己写的小工具来记录日志,输出目标包 ...
- 跟我一起学.NetCore之选项(Options)核心类型简介
前言 .NetCore中提供的选项框架,我把其理解为配置组,主要是将服务中可供配置的项提取出来,封装成一个类型:从而服务可根据应用场景进行相关配置项的设置来满足需求,其中使用了依赖注入的形式,使得更加 ...
- 跟我一起学.NetCore之静态文件处理的那些事
前言 如今前后端分离开发模式如火如荼,开发职责更加分明(当然前后端一起搞的模式也没有完全褪去):而对于每个公司产品实施来说,部署模式会稍有差别,有的会单独将前端文件部署为一个站点,有的会将前端文件和后 ...
- 跟我一起学.NetCore之WebApi接口裸奔有风险(Jwt)
前言 撸码需谨慎,裸奔有风险.经常在一些技术交流群中了解到,还有很多小伙伴的项目中Api接口没有做任何安全机制验证,直接就裸奔了,对于一些临时项目或是个人小项目还好,其余的话,建议小伙伴们酌情考虑都加 ...
- 跟我一起学.NetCore之熟悉的接口权限验证不能少(Jwt)
前言 权限管控对于一个系统来说是非常重要的,最熟悉不过的是菜单权限和数据权限,上一节通过Jwt实现了认证,接下来用它实现接口权限的验证,为什么不是菜单权限呢?对于前后端分离而言,称其为接口权限感觉比较 ...
随机推荐
- Skill art函数遍历字典
https://www.cnblogs.com/yeungchie/ code procedure(ycartGo(length1) prog(() for(x 1 length1 printf(&q ...
- 关于SqlServer那些事1(回归基础)
即将实习,回归基础总结,希望可以再好好打磨一下基础的一些东西 关于如何在重新修改表结构时该变其权限设置 步骤: 点击工具 进入选项 设计器 取消勾选阻止保存要求重新创建表的更改 关于创建创建数据库以及 ...
- 【BZOJ4318】OSU! 题解(期望)
题目链接 题目大意:给定$n$个操作的成功率$p[i]$.连续成功操作$m$次可以贡献$m^3$的分数.问期望分数. 对于$(x+1)^3$ $=x^3+3x^2+3x+1$ 每多连续成功一次,对答案 ...
- 查看 Linux 系统服务的 5 大方法
Linux 系统服务有时也称为守护程序,是在Linux启动时自动加载并在Linux退出时自动停止的系统任务. 在本文中,良许将为大家介绍如何列出 Linux 系统里所有运行的服务,以及如何检查某个服务 ...
- Python实现 QQ 半自动发送情话,我追到了女神
之前追女神时候用的情话发送脚本,每次工作日上班开启电脑,就会唤醒QQ,然后发送一条情话给女神,自动唤醒QQ复制情话,不用担心遗忘,现在整理分享一下,妈妈再也不用担心我找不到对象了. 效果图: 很多人学 ...
- 经典的IPC问题
Inter-Process Communication的缩写,含义是进程间通信,是指两个进程间交换数据的过程. 哲学家进餐问题 概述 哲学家进餐/思考 进餐需要两把叉子 每次拿一把叉子 如何预防死锁 ...
- python流程控制-if
在python中流程控制可以分为三种,分别是顺序结构.分支结构和循环结构.分支结构:if..else循环结构:while循环.for循环 一:分支结构 1:单项分支 语法: 含义:判断条件,条件结果为 ...
- java Struts 多种表单写法
1.html:form(struts标签) 缺点:必须指定一个有效的action属性. 优点:可以使用struts token机制. 调用方法通过submit的name属性. <table al ...
- 2020-08-01:MySQL 的数据如何恢复到任意时间点?
福哥答案2020-08-01: 恢复到任意时间点以定时的做全量备份,以及备份增量的 binlog 日志为前提.恢复到任意时间点首先将全量备份恢复之后,再此基础上回放增加的 binlog 直至指定的时间 ...
- Vue 自定义VueRouter-简版
主要是思路,自己定义组件的时候可以借鉴 Vue-router的 类图 name options: ==> 记录构造函数中传入的对象,在 new VueRouter的时候传了一个对象( route ...