使用 AgileConfig 动态配置 NLog
NLog 是我们在 .NET 领域使用非常广泛的日志组件。它默认使用 xml 来维护它的配置。最近有几个同学问我当使用 AgileConfig 的时候如何配置 NLog 。因为 AgileConfig 不支持集成 xml 格式的配置。其实 NLog 是支持从 appsettings.json / IConfiguration 读取配置的,那么肯定跟我们的 AgileConfig 集合是没有问题的。以下介绍下 NLog 如何跟 AgileConfig 进行集成,以及支持动态化的配置。
使用 AgileConfig 配置 NLog
NLog 默认的配置是通过 xml 来配置的。现在我们的 .NET 程序大多数都是通过 appsettings.json 来配置的。NLog 提供了从 appsettings.json / IConfiguration 读取配置的的扩展。既然支持 IConfiguration 读取那么跟我们的 AgileConfig 起来就非常简单了。
修改 program.cs
从 nuget 安装:
NLog.Extensions.Hosting
NLog.Web.AspNetCore
使用 UseAgileConfig 扩展开启 AgileConfig 支持。在 builder.Services.AddLogging 方法内手动设置 LogManager.Configuration 的值。
//use agileconfig client
builder.Host.UseAgileConfig();
//add nlog porvider
builder.Services.AddLogging(b => {
b.ClearProviders();
IConfiguration config = builder.Configuration;
NLog.LogManager.Configuration = new NLogLoggingConfiguration(config.GetSection("NLog"));
b.AddNLogWeb();
});
在 AgileConfig 维护配置
修改好代码后,我们需要把 json 配置文件维护到 AgileConfig 上。
AgileConfig 的基础使用不再赘述,看以前的文章。AgileConfig 资料 。
- 新建应用 Nlog_test
在 AgileConfig 控制台新建一个应用 Nlog_test 。

- 维护 Nlog 配置
把以下 json 配置维护到 Nlog_test 应用下。
{
"NLog": {
"rules": [
{
"logger": "*",
"minLevel": "Trace",
"writeTo": "logfile2"
}
],
"targets": {
"async": "True",
"logconsole": {
"type": "Console"
},
"logfile1": {
"fileName": "d:/nlogs/nlog-${shortdate}.log",
"type": "File"
},
"logfile2": {
"fileName": "d:/nlogs/nlog-${shortdate}-file2.log",
"type": "File"
}
},
"throwConfigExceptions": "True"
}
}
复制以上 json 文件粘贴到 “编辑 JSON” 文本框:

- 发布配置
点击发布按钮,上线 Nlog 配置。

运行项目
运行项目后我们可以看到日志已经写到指定的位置,说明 Nlog 成功从 AgileConfig 读取到了配置。
动态刷新 NLog 配置
上面的代码我们实现了脱离 xml 从 Agileconfig 读取配置来 NLog ,但是我们这个配置是一次性的,当我们在 AgileConfig 控制台修改配置的时候并不会更改 Nlog 的配置。这个显然不符合我们 AgileConfig 动态配置的气质。既然 NLog 不会自动监听 IConfiguration 的变化,那么我们就通过 AgileConfig 的配置变化事件来手动 reload NLog 的配置吧。
void loadNlogConfig()
{
IConfiguration config = builder.Configuration;
NLog.LogManager.Configuration = new NLogLoggingConfiguration(config.GetSection("NLog"));
NLog.LogManager.Configuration.Reload();
}
//use agileconfig client
builder.Host.UseAgileConfig((ConfigChangedArg e) => {
loadNlogConfig();
});
//add nlog porvider
builder.Services.AddLogging(b => {
b.ClearProviders();
NLog.LogManager.ConfigurationChanged += (_, _) => NLog.LogManager.ReconfigExistingLoggers();
loadNlogConfig();
b.AddNLogWeb();
});
通过以上配置,当我们在 AgileConfig 修改 Nlog 配置规则的时候,只要点击发布,应用的 Nlog 配置就会实时更改。
AgileConfig
AgileConfig 是一个轻量级配置中心
Github地址:https://github.com/dotnetcore/AgileConfig 开源不易,欢迎star
演示地址:http://agileconfig_server.xbaby.xyz/ 超级管理员账号:admin 密码:123456
关注我的公众号一起玩转技术

使用 AgileConfig 动态配置 NLog的更多相关文章
- Quartz 在 Spring 中如何动态配置时间--转
原文地址:http://www.iteye.com/topic/399980 在项目中有一个需求,需要灵活配置调度任务时间,并能自由启动或停止调度. 有关调度的实现我就第一就想到了Quartz这个开源 ...
- winform app.config文件的动态配置
获取 获取应用程序exe.config文件中 节点value值 /// <summary> /// 功能: 读取应用程序exe.config文件中 /// appSettings节点下 ...
- Spring动态配置多数据源
Spring动态配置多数据源,即在大型应用中对数据进行切分,并且采用多个数据库实例进行管理,这样可以有效提高系统的水平伸缩性.而这样的方案就会不同于常见的单一数据实例的方案,这就要程序在运行时根据当时 ...
- Struts2的处理结果(三)——动态配置结果
Struts2的处理结果(三) --动态配置结果 1.使用表达式语法 示例: <struts> <constant name="struts.enable.DynamicM ...
- 4、android xml中drawableTop(drawableBoottom、drawableLeft、drawableRight)在java代码中的动态配置
做安卓开发的朋友都知道,我们在xml中可以通过这样来对button设置其上部或者(下.左.右)的图片资源: 那么如果需要动态配置图片呢?我们不得不使用java代码来进行操作: Drawable dra ...
- Quartz动态配置表达的方法
在项目中有一个需求,需要灵活配置调度任务时间,并能自由启动或停止调度.有关调度的实现我就第一就想到了Quartz这个开源调度组件,因为很多项目使用过,Spring结合Quartz静态配置调度任务时间, ...
- IK-Analyzer(5.3.1)动态配置自定义词典
参考文献:http://blog.csdn.net/fatpanda/article/details/37911079 jar包: IK-Analyzer-extra-5.3.1.jar IKAnal ...
- activiti 动态配置 activiti 监听引擎启动和初始化(高级源码篇)
1.1.1. 前言 用户故事:现在有这样一个需求,第一个需求:公司的开发环境,测试环境以及线上环境,我们使用的数据库是不一样的,我们必须能够任意的切换数据库进行测试和发布,对数据库连接字符串我们需要加 ...
- Quartz实现分布式可动态配置的定时任务
关键词: 1. 定时任务 2. 分布式 3. 可动态配置触发时间 一般通过Quartz实现定时任务很简单.如果实现分布式定时任务需要结合分布式框架选择master节点触发也可以实现.但我们有个实际需求 ...
随机推荐
- C++ | 简单工厂模式 | 复数计算器
简单工厂模式最直观的一个应用便是实现一个计算器的程序. 比如,公司让你给计算器添加一个幂运算的功能,你只需要设计一个幂运算的类,并实现幂运算的逻辑,然后让该类继承自运算类即可. 简单工厂模式: 简单工 ...
- Matlab解析LQR与MPC的关系
mathworks社区中的这个资料还是值得一说的. 1 openExample('mpc/mpccustomqp') 我们从几个角度来解析两者关系,简单的说就是MPC是带了约束的LQR. 在陈虹模型预 ...
- 驳《我不是很懂 Node.js 社区的 DRY 文化》
今天在群里有人讨论方老师的文章<我不是很懂 Node.js 社区的 DRY 文化>,我也看了一遍,槽点太多,不知道如何下笔. 方老师分析了几个依赖最多的 npm 包,每个都只有不到百行代码 ...
- 获取MCCMNC号
public static boolean isColombiaSpanishSimCard(){ TelephonyManager telManager = (TelephonyMan ...
- 前端复制粘贴文字clipBoard.js的使用
1. vue 中的复制粘贴: <div class="mainTextItem" @click="copyTXTOne" id="copyOn ...
- vivo 短视频推荐去重服务的设计实践
一.概述 1.1 业务背景 vivo短视频在视频推荐时需要对用户已经看过的视频进行过滤去重,避免给用户重复推荐同一个视频影响体验.在一次推荐请求处理流程中,会基于用户兴趣进行视频召回,大约召回2000 ...
- SpringMVC获取请求参数-基本类型
1.Controller中的业务方法的参数名称要与请求参数的name一致,参数值会自动映射匹配 (json形式) <dependency> <groupId>com.faste ...
- 学习打卡——CentOS 7安装
本来今天是要学习redis的,但是redis官方又不支持在win下运行,windows版本目前都是微软官方在维护.redis最新版都已经更新到7.0了,windows却还是只有3.x版本.所以随性就去 ...
- 安卓记账本开发学习day5之版本兼容问题
安卓5.0以上版本想要隐藏DatePicker头布局的写法比较复杂,需要一层一层隐藏 int headerId = getContext().getResources().getIdentifier( ...
- canvas 整个透明
ctx.globalAlpha=.9