NLog 在NetCore中实现多实例注入DI, 实现多租户模式
通常, 我们在使用了 Microsoft.Extensions.DependencyInjection DI框架的情况下, 我们一般通过
.ConfigureLogging((HostBuilderContext host, ILoggingBuilder logBuilder)=>{
logBuilder.AddNLog(...)
})
或者
.ConfigureWebHostDefaults(builder=>{
builder.UseStartup<Startup>()
.UseNLog(...)
})
等方式将NLog配置进入DI系统.
但是, 如果我们的DI用于多租户模式,像这样的NLog没法做到完全隔离.
因为在其内部都是使用的是一个默认的LogManager.LogFactory 静态的 NLog.LogFactory 对象, 所以在多次初始化的时候会发生配置覆盖的情况.
例如下面的这个例子:
//user1_services 的nlog配置会被user2_services的nlog配置覆盖, 我们就没法实现多租户(user1, user2)的完全隔离了. 不能实现不同的用户写入不同的地方(provider),使用不同的format, 不同的log level等.
ServiceCollection user1_services= new ServiceCollection();
user1_services.AddLogging(logBuilder=>{
logBuilder.AddNLog(...)
})
ServiceCollection user2_services= new ServiceCollection();
user2_services.AddLogging(logBuilder=>{
logBuilder.AddNLog(...)
})
所以, 我们要解决这个问题则要自定义使用的的LogFactory.
var nlogFactory = new NLog.LogFactory(new NLogLoggingConfiguration(configuration.GetSection("active_user_nlog_options"))); // nlog的配置选项, targets, rules 等等.
var nlogProviderOptions = configuration.GetSection("active_user_nlog_provider_options").Get<NLogProviderOptions>();// IncludeScopes, ParseMessageTemplates, IgnoreEmptyEventId 等配置选项
var nlogLoggerProvider = new NLogLoggerProvider(nlogProviderOptions, nlogFactory );
loggerBuilder.AddProvider(nlogLoggerProvider);
//或者
loggerBuilder.AddNLog(sp => new NLog.LogFactory(...));
需要注意的是还有一个feature要注意使用方式, 文档参考:https://github.com/NLog/NLog/wiki/ConfigSetting-Layout-Renderer
因为这货也是一个静态变量在维护, 可以通过NLog.LayoutRenderers.LayoutRenderer.Register("configsetting","NLog.Extensions.Logging.ConfigSettingLayoutRenderer")替换掉默认实现.
//默认实现.
private static IConfiguration SetupConfiguration(IServiceProvider serviceProvider, IConfiguration configuration)
{
configuration = (configuration ?? (serviceProvider?.GetService(typeof(IConfiguration)) as IConfiguration));
if (configuration != null)
{
ConfigSettingLayoutRenderer.DefaultConfiguration = configuration;
}
return configuration;
}
至于是否还有其他的坑, 还得踩进去才知道, 日常记录, 以供参考
NLog 在NetCore中实现多实例注入DI, 实现多租户模式的更多相关文章
- ELK分布式日志+NLog在.NetCore中的应用
一.ELK简介 ELK是Elasticsearch.Logstash和Kibana首字母的缩写.这三者均是开源软件,这三套开源工具组合起来形成了一套强大的集中式日志管理平台 Elasticsearch ...
- .NetCore中三种注入方式的思考
该篇内容由个人博客点击跳转同步更新!转载请注明出处! .NetCore彻底诠释了"万物皆可注入"这句话的含义,在.NetCore中到处可见注入的使用.因此core中也提供了三种注入 ...
- .netcore中的依赖注入
IOC.DI相关概念的理解 1.依赖:简单的讲就是"引用到".例如AccountController.cs引用到IAccountService.cs,那么AccountContro ...
- 在netcore中如何注入同一个接口的多个实现
netcore中自带了Ioc框架,这也影响了我们的编码习惯,以前都是静态类或者直接new对象,现在有了Ioc框架的支持,我们也不必守旧,应当使用起来,接受这种对象管理方式.使用过java的同仁,都习惯 ...
- .NetCore中的日志(2)集成第三方日志工具
.NetCore中的日志(2)集成第三方日志工具 0x00 在.NetCore的Logging组件中集成NLog 上一篇讨论了.NetCore中日志框架的结构,这一篇讨论一下.NetCore的Logg ...
- .NetCore中的日志(1)日志组件解析
.NetCore中的日志(1)日志组件解析 0x00 问题的产生 日志记录功能在开发中很常用,可以记录程序运行的细节,也可以记录用户的行为.在之前开发时我一般都是用自己写的小工具来记录日志,输出目标包 ...
- Consul+Ocelot+Polly在.NetCore中使用(.NET5)-Ocelot+Polly缓存、限流、熔断、降级
相关文章 Consul+Ocelot+Polly在.NetCore中使用(.NET5)-Consul服务注册,服务发现 Consul+Ocelot+Polly在.NetCore中使用(.NET5)-网 ...
- ASP.NET Core中如影随形的”依赖注入”[下]: 历数依赖注入的N种玩法
在对ASP.NET Core管道中关于依赖注入的两个核心对象(ServiceCollection和ServiceProvider)有了足够的认识之后,我们将关注的目光转移到编程层面.在ASP.NET ...
- AngularJS学习--- AngularJS中XHR(AJAX)和依赖注入(DI) step5
前言:本文接前一篇文章,主要介绍什么是XHR,AJAX,DI,angularjs中如何使用XHR和DI. 1.切换工具目录 git checkout -f step- #切换分支 npm start ...
- 为什么多线程、junit 中无法使用spring 依赖注入?
为什么多线程.junit 中无法使用spring 依赖注入? 这个问题,其实体现了,我们对spring已依赖太深,以至于不想自己写实例了. 那么到底是为什么在多线程和junit单元测试中不能使用依赖注 ...
随机推荐
- 2024年是否是人形机器人的元年 —— 继OpenAI/Google/特斯拉之后黄仁勋也宣布NVIDIA公司的人形机器人项目 —— Groot项目 —— 英伟达公布了人形机器人项目 GR00T
相关: https://www.youtube.com/watch?v=bMIRhOXAjYk 参考: https://www.thepaper.cn/newsDetail_forward_26730 ...
- 解决 jquery attr多次使用失效的问题
今天做一个全选功能的时候用到了jq 的attr 的方法,可是在真正使用的时候首次是可以实现全选和全不选的功能,然而 多点几次就会发勾选的效果消失了!先看下代码吧: <!DOCTYPE html& ...
- B. BerSU Ball
B. BerSU Ball 排序后考虑\(dp\),\(dp_{i,j}\)表示前\(i\)个男生和前\(j\)个女生能匹配的最大数. \[\begin{aligned} if(|a_i - b_j| ...
- SMCA:港中文提出注意力图校准的DETR加速方案 | ICCV 2021
为了加速DETR收敛,论文提出了简单而有效的Spatially Modulated Co-Attention(SMCA)机制,通过在初始边界框位置给予较高的协同注意力响应值的约束来构建DETR的回归感 ...
- 一款运行于windows上的linux命令神器-Cmder(已经爱不释手)
一.前言 很多工程师都习惯了使用linux下一些命令,再去用Windows的 cmd 简直难以忍受. 要在windows上运行linux命令,目前比较流行的方式由: GunWin32.Cygwin.W ...
- 手把手教Linux驱动5-自旋锁、信号量、互斥体概述
在Linux系统中有大量的临界资源需要保护,如何让各个任务有条不紊的访问这些资源,这涉及到Linux中并发访问的保护机制设计相关知识.后面会详细介绍这几个机制. (据可靠消息,锁的实现经常出现在笔试环 ...
- 带你了解 WebAssembly 的发展、应用与开发
一.WebAssembly 是什么? "WebAssembly(缩写为 Wasm)是一种基于堆栈式虚拟机的二进制指令集.Wasm 被设计成为一种编程语言的可移植编译目标,并且可以通过将其部署 ...
- STL 改造红黑树 模拟封装set和map
改造红黑树 目录 改造红黑树 适配STL迭代器的红黑树 基本结构 RBTreeNode __RBTree_iterator RBTree 完整代码 封装的set 封装的map 在初次看STL中实现红黑 ...
- spark 解析 kafka message
备用 https://databricks.com/blog/2018/11/30/apache-avro-as-a-built-in-data-source-in-apache-spark-2-4. ...
- A股迎来中报季,合合信息文档解析技术辅助大模型深度解读财报
财务报告是公众和投资者了解企业经营状况的主要信源之一.步入8月中下旬,上市公司进入了中报披露高峰期.据东方财富Choice数据统计,截至8月14日数据,A股有超过1715只个股公布了2024年半年度业 ...