【NetCore】08-日志框架

news/2024/5/19 21:30:37 标签: 开发语言, .netcore, 后端

文章目录

    • 1.日志框架-日志框架最佳姿势
    • 2.日志作用域-解决不同请求之间的日志干扰
      • 2.1 作用域场景
    • 3 结构化日志组件Serilog:记录对查询分析友好的日志
      • 3.1 结构化日志的好处
      • 3.2 使用场景举例

1.日志框架-日志框架最佳姿势

  • 引用程序包
  • Microsoft.Extensions.Logging
  • Microsoft.Extensions.Logging.Console
  • Microsoft.Extensions.Logging.Debug
  • Microsoft.Extensions.Logging.TraceSource
// 控制台程序
static void Main(string[] args)
{
    // 读取文件配置 
	IConfigurationBuilder configBuilder = new ConfigurationBuilder();
	configBuilder .AddJsonFile("appsettings.json",optional:false,reloadOnChange:true);
	var config = configBuilder.Build();
	// 将实例注册到容器
	IServiceCollection serviceCollection = new ServiceCollection();
	
	//如果直接这样注册,那么容器将不会管理注册实例的生命周期
	//serviceCollection.AddSingleton< IConfiguration>(config);
	//用工厂模式将配置对象注册到容器管理
	serviceCollection.AddSingleton< IConfiguration>(p=>config);
	
	serviceCollection.AddLogging(builder=>
	{
		builder.AddConfiguration(config.GetSection("Logging"));
		builder.AddConsole();
	});
	
	IServiceProvider service = serviceCollection.BuildServiceProvider();
	// 日志对象获取
	ILoggerFactory loggerFactory = service.GetService< ILoggerFactory>();
	// 创建日志记录器
	var alogger = loggerFactory.CreateLogger("alogger");
	alogger.LogDebug(100,"mess");// 100为定义的事件ID
	alogger.LogInformation("hello");
		
}


// 配置文件
{
	"Logging":{
		"LogLevel":{
			"Default":"Debug",
			"Microsoft":"Warning",
			"Microsoft.Hosting.Lifetime":"Information"
		}
	},
	"Console":{
		"LogLevel":{
			"Default":"Information",
			"Program":"Trace",
			"alogger":"Trace"
		}
	}
}

  • 日志需要避免记录敏感信息,如密码、密码

⑴ alogger.LogInformation(“Message Time is {dateTime}”,DateTime.Now);
⑵ alogger.LogInformation($@“Message Time is {DateTime.Now}”);
如上所示,上述两句代码执行结果是相同的,但是具体执行逻辑是不同的。
第⑴行代码的字符串拼接是发生在LogInformation内部的Console输出时产生
而第⑵行代码的字符串拼接发生在向LogInformation传递参数之前
如果日志输出级别设置为None时,虽然两行代码的输出都是空,但是第⑴行代码的字符串拼接不会发生,而第⑵行的字符串拼接还是发生了,这是对服务器性能的一个比较大的消耗,这里需要避免

2.日志作用域-解决不同请求之间的日志干扰

2.1 作用域场景

  • 一个事务包含多条操作
  • 复杂流程的日志关联,如工作流流程记录日志
  • 调用链追踪与请求处理过程对应时
static void Main(string[] args)
{
    // 读取文件配置 
	IConfigurationBuilder configBuilder = new ConfigurationBuilder();
	configBuilder.CommandLine(args);
	configBuilder .AddJsonFile("appsettings.json",optional:false,reloadOnChange:true);
	var config = configBuilder.Build();
	
	// 将实例注册到容器
	IServiceCollection serviceCollection = new ServiceCollection();
	//用工厂模式将配置对象注册到容器管理
	serviceCollection.AddSingleton< IConfiguration>(p=>config);
	serviceCollection.AddLogging(builder=>
	{
		builder.AddConfiguration(config.GetSection("Logging"));
		builder.AddConsole();
		builder.AddDebug();// 日志输出到VS调试信息框中
	});
	
	IServiceProvider service = serviceCollection.BuildServiceProvider();
	var logger = service.GetService<ILogger<Program>();
	
	// 如果想要输出ScopeId需要在配置文件中设置IncludeScopes属性为true,如下配置文件所示
	// 配置如果发生修改,会同步热更新
	using(logger.BeginSope("ScopeId:{scopeId}",Guid.NewGuid()))
	{
		logger.LogInformation("Inofo");
		logger.logError("Error");
		logger.LogTrace("Trace");
	}
	
	Console.ReadKey();
}

// 配置文件
{
	"Logging":{
		"LogLevel":{
			"Default":"Debug",
			"Microsoft":"Warning",
			"Microsoft.Hosting.Lifetime":"Information"
		}
	},
	"Console":{
		"IncludeScopes":true,
		"LogLevel":{
			"Default":"Information",
			"Program":"Trace",
			"alogger":"Trace"
		}
	}
}

3 结构化日志组件Serilog:记录对查询分析友好的日志

3.1 结构化日志的好处

  • 易于检索
  • 易于分析统计

3.2 使用场景举例

  • 实现日志告警
  • 实现上下文的关联
  • 实现与追踪系统集成
// asp web程序
//应用程序包 Serilog.AspNetCore

public class Program
{
	// 读取配置
	public static IConfiguration Configuration{get;} = new ConfigurationBuilder()
		.SetBasePath(Directory.GetCurrentDirectory())
		.AddJsonFile("appsetting.json",optional:false,reloadOnChange:true)
		.AddJsonFile($"appsetting.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")??"Production"}.json",optional:false,reoladOnChange:true)
		.AddEnvironmentVariable()
		.Build();		
	
	public static int Main(string[] args)
	{
		// 将配置传递给Serilog的初始化过程
		Log.Logger = new LoggerConfiguration().ReadFrom.Configuration(Configuration)
		.MinimumLevel.Debug()
		.Enrich.FromLogContext()
		.WriteTo.Console(new RenderedCompactJsonFormatter())
		.WriteTo.File(formatter:new CompactJsonFormatter(),"logs\\myapp.txt",rollingInterval:RollingInterval.Day)
		.CreateLogger();

		try
		{
			Log.Infotmation("Start web host");
			CreateHostBuilder(args).Builde().Run();
			return0;
		}catch(Exception ex)
		{
			Log.Fatal(ex,"Host terminated unexpectedly");
			return 1;
		}finally{
			Log.CloseAndFlush();
		}
	}
	
	public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args)
			.ConfigureWebHostDefaults(webBuilder => 
			{
				webBuilder.UseStartup<Startup>();
			})
			.UserSerilog(dispose:true);
	
}

// 配置文件
{
	"Logging":{
		"LogLevel":{
			"Default":"Debug",
			"Microsoft":"Warning",
			"Microsoft.Hosting.Lifetime":"Information"
		}
	},
	"Serilog":{
		"MinimumLevel":{
			"Default":"Information",
			"Override":{
					"Microsoft":"Error",
					"System":"Information"
			}
		}
	},
	"AlloweHost":"*"
}


http://www.niftyadmin.cn/n/4934479.html

相关文章

(文章复现)基于灰狼算法(GWO)的交直流混合微网经济调度matlab代码

参考文献&#xff1a; [1]高瑜,黄森,陈刘鑫等.基于改进灰狼算法的并网交流微电网经济优化调度[J].科学技术与工程, 2020,20(28):11605-11611. [2]邓长征,冯朕,邱立等.基于混沌灰狼算法的交直流混合微网经济调度[J].电测与仪表, 2020, 57(04):99-107. 这两篇文章不管是从模型、…

jvm——垃圾回收机制(GC)详解

开始之前有几个GC的基本问题 什么是GC&#xff1f; GC 是 garbage collection 的缩写&#xff0c;意思是垃圾回收——把内存&#xff08;特别是堆内存&#xff09;中不再使用的空间释放掉&#xff1b;清理不再使用的对象。 为什么要GC&#xff1f; 堆内存是各个线程共享的空间…

【python】爬取豆瓣电影Top250(附源码)

前言 在网络爬虫的开发过程中&#xff0c;经常会遇到需要处理一些反爬机制的情况。其中之一就是网站对于频繁访问的限制&#xff0c;即IP封禁。为了绕过这种限制&#xff0c;我们可以使用代理IP来动态改变请求的来源IP地址。在本篇博客中&#xff0c;将介绍如何使用代理IP的技术…

五、Netty高性能架构设计

目录 5.1 线程模型基本介绍5.2 传统阻塞I/O服务模型5.2.1 工作原理5.2.2 阻塞IO模型特点5.2.3 阻塞IO存在的问题 5.3 Reactor模式5.3.1 针对传统阻塞IO服务模型的2个缺点&#xff0c;解决方案5.3.2 IO复用 线程池&#xff0c;就是Reactor模式设计的基本思想 5.1 线程模型基本介…

K8S系列文章之 Shell批处理脚本应用

一、简要说明 1、批处理脚本介绍 命令批处理脚本&#xff1a;/usr/shell/all.sh文件批量分发脚本&#xff1a;/usr/shell/scp.sh 2、批处理命令脚本原理 读取/usr/shell/hosts文件中的ip列表使用$*接收脚本所有参数for循环遍历hosts文件中的ip地址通过ssh host cmd 实现目的…

手把手教你使用USB的CDC+MSC复合设备(基于stm32f407)

学习 1 实验环境与说明2 USB CDC2.1 CDC代码生成2.2 通信设备&#xff08;CDC&#xff09;描述符2.2.1 设备描述符2.2.2 配置描述符 2.3 调试 3 USB MSC3.1 MSC代码生成3.2 大容量存储设备&#xff08;MSC&#xff09;描述符3.2.1 设备描述符2.2.2 配置描述符 3.3 调试 4 USB复…

设备工单管理系统如何实现工单流程自动化?

设备工单管理系统属于工单系统的一种&#xff0c;基于其丰富的功能&#xff0c;它可以同时处理不同的多组流程&#xff0c;旨在有效处理发起人提交的事情&#xff0c;指派相应人员完成服务请求和记录全流程。该系统主要面向后勤管理、设备维护、物业管理、酒店民宿等服务行业设…

深度学习(36)—— 图神经网络GNN(1)

深度学习&#xff08;36&#xff09;—— 图神经网络GNN&#xff08;1&#xff09; 这个系列的所有代码我都会放在git上&#xff0c;欢迎造访 文章目录 深度学习&#xff08;36&#xff09;—— 图神经网络GNN&#xff08;1&#xff09;1. 基础知识2.使用场景3. 图卷积神经网…