使用 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节点触发也可以实现.但我们有个实际需求 ...
随机推荐
- 面试题目:手写一个LRU算法实现
一.常见的内存淘汰算法 FIFO 先进先出 在这种淘汰算法中,先进⼊缓存的会先被淘汰 命中率很低 LRU Least recently used,最近最少使⽤get 根据数据的历史访问记录来进⾏淘汰 ...
- Altium Designer 原理图的绘制前导
元件库.封装库设计 部分元器件厂商或者经销商不提供元件库和封装库,只给了元器件尺寸图,所以需要自行设计元件库文件或是封装库文件 元件库设计: 新建 .SchLib 文件:File -> N ...
- 分压杯频LLC变换器
- 【静态页面架构】CSS之链接和图像
CSS架构 一.链接: 链接元素:通过使用a元素的href属性设置跳转到指定页面地址 <style> a{ color: blue; text-decoration: none; } a: ...
- css 迷惑的position
迷惑的position 小加发现实际开发中position使用频率很高,但很多人却对position不是很了解,导致开发中出现各种问题,现在让我门一起来看看这个迷惑的position吧~ static ...
- angular组件开发
项目中经常会有一些公共组件,比如header,如果每个页面都写一遍的话显得很冗余,而且不利于维护,这时候我们就会考虑将这些公共部分抽取出来,做成一个单独的组件. 然而angular不是很熟悉啊~怎么啵 ...
- [翻译]Service workers:PWA背后的英雄
原文地址:https://medium.freecodecamp.org/service-workers-the-little-heroes-behind-progressive-web-apps-4 ...
- 校验ip地址的格式
/*输入:strIP:ip地址 返回:如果通过验证返回true,否则返回false: */ function isIP(strIP) { if (isNull(strIP)) return false ...
- URLDNS反序列化链学习
URLDNS URLDNS跟CommonsCollections比起来真是眉清目秀,该链主要用于验证漏洞,并不能执行命令,优点就是不依赖任何包. 1.利用链 * Gadget Chain: * Has ...
- 变量 数据类型 条件if语句
python是解释型 弱类型编程语言; "优雅", "明确", "简单"; 开发效率非常高; 可移植性; 可扩展性; 可嵌入型. ...