通常, 我们在使用了 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, 实现多租户模式的更多相关文章

  1. ELK分布式日志+NLog在.NetCore中的应用

    一.ELK简介 ELK是Elasticsearch.Logstash和Kibana首字母的缩写.这三者均是开源软件,这三套开源工具组合起来形成了一套强大的集中式日志管理平台 Elasticsearch ...

  2. .NetCore中三种注入方式的思考

    该篇内容由个人博客点击跳转同步更新!转载请注明出处! .NetCore彻底诠释了"万物皆可注入"这句话的含义,在.NetCore中到处可见注入的使用.因此core中也提供了三种注入 ...

  3. .netcore中的依赖注入

    IOC.DI相关概念的理解 1.依赖:简单的讲就是"引用到".例如AccountController.cs引用到IAccountService.cs,那么AccountContro ...

  4. 在netcore中如何注入同一个接口的多个实现

    netcore中自带了Ioc框架,这也影响了我们的编码习惯,以前都是静态类或者直接new对象,现在有了Ioc框架的支持,我们也不必守旧,应当使用起来,接受这种对象管理方式.使用过java的同仁,都习惯 ...

  5. .NetCore中的日志(2)集成第三方日志工具

    .NetCore中的日志(2)集成第三方日志工具 0x00 在.NetCore的Logging组件中集成NLog 上一篇讨论了.NetCore中日志框架的结构,这一篇讨论一下.NetCore的Logg ...

  6. .NetCore中的日志(1)日志组件解析

    .NetCore中的日志(1)日志组件解析 0x00 问题的产生 日志记录功能在开发中很常用,可以记录程序运行的细节,也可以记录用户的行为.在之前开发时我一般都是用自己写的小工具来记录日志,输出目标包 ...

  7. Consul+Ocelot+Polly在.NetCore中使用(.NET5)-Ocelot+Polly缓存、限流、熔断、降级

    相关文章 Consul+Ocelot+Polly在.NetCore中使用(.NET5)-Consul服务注册,服务发现 Consul+Ocelot+Polly在.NetCore中使用(.NET5)-网 ...

  8. ASP.NET Core中如影随形的”依赖注入”[下]: 历数依赖注入的N种玩法

    在对ASP.NET Core管道中关于依赖注入的两个核心对象(ServiceCollection和ServiceProvider)有了足够的认识之后,我们将关注的目光转移到编程层面.在ASP.NET ...

  9. AngularJS学习--- AngularJS中XHR(AJAX)和依赖注入(DI) step5

    前言:本文接前一篇文章,主要介绍什么是XHR,AJAX,DI,angularjs中如何使用XHR和DI. 1.切换工具目录 git checkout -f step- #切换分支 npm start ...

  10. 为什么多线程、junit 中无法使用spring 依赖注入?

    为什么多线程.junit 中无法使用spring 依赖注入? 这个问题,其实体现了,我们对spring已依赖太深,以至于不想自己写实例了. 那么到底是为什么在多线程和junit单元测试中不能使用依赖注 ...

随机推荐

  1. pve 安装配置问题集锦

    官网:https://www.proxmox.com/en/ 下载:https://www.proxmox.com/en/downloads 安装:https://pve.proxmox.com/wi ...

  2. blender-1-基本快捷键

    https://www.bilibili.com/video/BV14u41147YH?p=3&vd_source=e3899eab0ab1c2da60e189bdce9ed666 跟他学的 ...

  3. C#窗体自定义快捷操作键的实现 - 开源研究系列文章

    这次想到应用程序的窗体的快捷操作键的使用的问题. 上次发布过一个快捷键的例子(https://www.cnblogs.com/lzhdim/p/18342051),区别在于它是操作系统全局注册的热键, ...

  4. mybatis坑之数字字符串比对

    在mybatis开发过程中有需要在sql中判断查询哪张表,如下sql: SELECT a.tag_name, a.tag_id, count( 0 ) AS base_total FROM mm_dd ...

  5. freertos学习(九)软件定时器

    软件定时器 软件定时器是freeRTOS通过一个硬件定时器,实现的定时器.可以实现不同时长的多个定时任务 不从中断上下文中执行定时器回调函数(不消耗任何处理时间) 实现流程 设置软件定时器,推入定时器 ...

  6. 对GEE下载时分块影像进行镶嵌(GDAL)

    前言 GDAL自带的镶嵌功能比较单一,只能将图像简单拼接到一起,不能实现直方图匀色以及羽化等功能,但是对GEE导出的分块影像进行镶嵌较为适合. 优点: 使用代码,镶嵌多个影像较为简便 GDAL较为稳定 ...

  7. ECharts实现雷达图详解

    ECharts 是一款由百度开源的数据可视化工具,它提供了丰富的图表类型,如折线图.柱状图.饼图.散点图.雷达图.地图.K线图.热力图.仪表盘等,以及丰富的交互功能.ECharts 组件的核心功能实现 ...

  8. 【YashanDB数据库】Ubuntu系统加载Yashan C驱动后无法使用PHP

    [问题分类]驱动使用 [关键字]驱动使用.PHP.Ubuntu.C驱动 [问题描述] 客户将YashanDB的C驱动lib加载到环境变量LD_LIBRARY_PATH后,PHP报错:PHP Fatal ...

  9. docker network macvlan

    ref: Docker 网络模型之 macvlan 详解,图解,实验完整 网卡也能虚拟化?网卡虚拟化技术 macvlan 详解 docker和macvlan与host互通  

  10. 物体检测序列之一:ap, map

    准确率(Precision),也叫正确预测率(positive predictive value),在模式识别.信息检索.机器学习等研究应用领域,准确率用来衡量模型预测的结果中相关或者正确的比例.而召 ...