通常, 我们在使用了 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. .NetCore中三种注入生命周期的思考

    .NetCore彻底诠释了"万物皆可注入"这句话的含义,在.NetCore中到处可见注入的使用.因此core中也提供了三种注入方式的生命周期使用,分别是: AddTransient ...

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

    .NetCore中三种注入方式的思考 原文:.NetCore中三种注入方式的思考 该篇内容由个人博客点击跳转同步更新!转载请注明出处! .NetCore彻底诠释了"万物皆可注入"这 ...

  3. Coravel是.NetCore中开源的工具库,可以让你使用定时任务,缓存,队列,事件,广播等高级应用程序变得轻而易举!...

    Coravel Coravel是.NetCore中开源的工具库,可以让你使用定时任务,缓存,队列,事件,广播等高级应用程序变得轻而易举! Coravel 帮助开发人员在不影响代码质量的情况下快速启动和 ...

  4. 跟我一起学.NetCore之Asp.NetCore中集成Autofac扩展

    前言 前两节针对.NetCore自带的依赖注入进行简要概述,对于日常开发的需求应该是能满足了,那为什么还需要引入第三方依赖注入组件呢,这里就从自带的依赖注入来分析,有什么样的需求满足不了?主要归纳为以 ...

  5. 避免在 ASP.NET Core 3.0 中为启动类注入服务

    本篇是如何升级到ASP.NET Core 3.0系列文章的第二篇. Part 1 - 将.NET Standard 2.0 类库转换为.NET Core 3.0 类库 Part 2 - IHostin ...

  6. SQL Server应用程序中的高级SQL注入

    作者:不详 来源:techtarget http://www.csai.cn 2006年5月11日 摘要:这份文档是详细讨论SQL注入技术,它适应于比较流行的IIS+ASP+SQLSERVER平台.它 ...

  7. SQL Server应用程序中的高级SQL注入[转]

    SQL Server应用程序中的高级SQL注入[从A.Z的POST里转载,经过整理] 作者:Chris Anley[chris@ngssoftware.com] An NGSSoftware Insi ...

  8. .NetCore中EFCore for MySql整理(二)

    一.简介 EF Core for MySql的官方版本MySql.Data.EntityFrameworkCore 目前正是版已经可用当前版本v6.10,对于以前的预览版参考:http://www.c ...

  9. php yii框架使用教程,php中yii框架实例用法

    Yii2框架在目前而言,网络上好评不断,最主要的原因,不管是新的框架,还是回顾旧的框架,总是有一个无法代替的优点,就是做事快,在性能使用上,也是一般框架无法媲美的,在php最好用的框架评选了,永远都是 ...

最新文章

  1. 外卖小哥转行IT面完阿里后,又回去送外卖了,真实经历!
  2. 构建之法现代软件工程(第五次)
  3. stm32f4xx 的EXTI使用的一般步骤
  4. 【leetcode】41. First Missing Positive
  5. 如果更改列为自增自段
  6. 应用传送网络(ADN):率先架起“东数西算”的“高速公路”
  7. java 死锁_java死锁分析
  8. 《Algorithms》常见排序算法比较
  9. 实验代做 行人识别_《行人跨模态重识别 | 双向限制的排序损失》
  10. 访问地图http://clustrmaps.com/zh/admin/action.php
  11. cs231n课后作业(1)
  12. 印象笔记如何html导出数据,印象笔记如何导出导入笔记?
  13. 三菱伺服自动调谐_三菱伺服mr-j3与mr-j4参数有什么差别
  14. 15个HTML5播放器插件
  15. 工业制造行业B2B电商平台解决方案
  16. golang实现稀疏数组(Sparse array)
  17. 什么是上下变频器?以及对5G应用的作用
  18. 曾经山寨手机上的跨平台方案
  19. 怎么做副业越做越好?看钟汉良抱大腿白皮书
  20. mysql 人名用什么类型_MySQL 基础(二)

热门文章

  1. Python实现excel统计排序输出,生成统计分布直方图
  2. android 技术大牛 BLOG
  3. 乐游游戏盒计算机丢失,乐游游戏盒子加载不出来怎么办
  4. javaMail发送163企业邮箱
  5. 重启计算机后桌面顺序是反的,win10系统修改桌面后重启电脑桌面又回到初始状态的方案...
  6. 绝对剩余价值和相对剩余价值举例
  7. html语言图片对齐方式的设置
  8. endnote中英混排时“等“与“et al”的处理
  9. MBTI职业性格测试(Psytopic特别版) 1
  10. 股价横盘一年,抄底百度的最佳时机到了?