.NET Core 中的日志与分布式链路追踪

微软中国MSDN 点击上方 蓝字关注我们
大家好 , 我是本期的实验室研究员——痴者工良 。 今天我将通过实验和完整的操作过程 , 向大家简单地介绍 .NET Core 中的日志和链路追踪 , 以及通过链路收集日志 。 接下来就让我们一起到实验室中一探究竟吧!
微软MVP实验室研究员
.NET Core 中的日志与分布式链路追踪
文章图片

痴者工良
身份:高级程序员劝退师
简介:一个小逗比
技术栈:.NET、Go、Web、云计算、物联网、Linux、容器、微服务、Kubernetes
目录
.NET Core 中的日志

  • 控制台输出
  • 非侵入式日志
  • Microsoft.Extensions.Logging
  • Trace、Debug
链路跟踪
  • OpenTracing
  • 上下文和跟踪功能
分布式链路跟踪
  • 在不同进程中跟踪
  • 在 ASP.NET Core 中跟踪
  • OpenTracing API 和 Jaeger
  • 链路追踪实践
.NET Core 中的日志与分布式链路追踪
程序记录的日志一般有两种作用 , 故障排查、显示程序运行状态 , 当程序发生故障时 , 我们可以通过日志定位问题 , 日志可以给我们留下排查故障的依据 。 很多时候 , 往往会认为日志记录非常简单 , 例如很多程序员只是使用 try-catch{}捕捉异常 , 直接输出到 .txt , 但是这些日志往往无法起到帮助定位问题的作用 , 甚至日志充斥了大量垃圾内容;日志内容全靠人眼一行行扫描 , 或者 Ctrl+F 搜索 , 无法高效率审查日志;日志单纯输出到文本文件中 , 没有很好地管理日志 。
接下来 , 我们将一步步学习日志的编写技巧 , 以及 OpenTracing API 、Jaeger 分布式链路跟踪的相关知识 。
.NET Core 中的日志
控制台输出
最简单的日志 , 就是控制台输出 , 利用 Console.WriteLine 函数直接输出信息 。
下面时一个简单的信息输出 , 当程序调用 SayHello 函数时 , SayHello 会打印信息 。
publicclassHello { publicvoidSayHello( stringcontent ){ varstr = $"Hello, {content}" ;Console.WriteLine(str); } } classProgram{staticvoidMain( string[] args ) {Hello hello = newHello; hello.SayHello( "any one"); Console.Read;}}
非侵入式日志
通过控制台 , 我们可以看到 , 为了记录日志 , 我们必须在函数内编写输入日志的代码 , 优缺点这些就不多说了 , 我们可以通过 AOP 框架 , 实现切面编程 , 同一记录日志 。
这里可以使用笔者开源的 CZGL.AOP 框架 , Nuget 中可以搜索到 。
.NET Core 中的日志与分布式链路追踪
文章图片

编写统一的切入代码 , 这些代码将在函数被调用时执行 。
Before 会在被代理的方法执行前或被代理的属性调用时生效 , 你可以通过 AspectContext 上下文 , 获取、修改传递的参数 。
After 在方法执行后或属性调用时生效 , 你可以通过上下文获取、修改返回值 。
publicclassLogAttribute: ActionAttribute{publicoverridevoidBefore( AspectContext context) {Console.WriteLine( $" {context.MethodInfo.Name}函数被执行前" ); }publicoverrideobjectAfter( AspectContext context) {Console.WriteLine( $" {context.MethodInfo.Name}函数被执行后" ); returnnull; }}
改造 Hello 类 , 代码如下:
  • 特别声明:本站内容均来自网友提供或互联网,仅供参考,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。