专栏首页汪宇杰博客ASP.NET Core里让NLog根据环境加载配置文件

ASP.NET Core里让NLog根据环境加载配置文件

我们知道ASP.NET Core自带了appsettings.环境名.json,天生就能做到根据不同的环境选择不同的配置文件。但是NLog的官方例子里只有一份nlog.config,如何根据不同环境加载不同配置呢?

怎么会有这种想法

首先,这个需求的背景,依然来源于我自己的博客系统(https://edi.wang)。我的博客运行在全球领先的微软智能云Azure国际版的App Services上(真香)。而这个服务有配套的日志文件夹,位于应用程序目录以外。虽然我仍然可以把日志记在网站目录下,但这么做并不是Azure的推荐实践。因此对于生产环境,我需要更改NLog的日志文件路径。

原路径

fileName="${basedir}\logs\${shortdate}.log"

新路径

fileName="${basedir}\..\..\LogFiles\Application\${shortdate}.log"

没错,NLog支持用"..\"的方式表示上一级文件夹。

现在生产环境没问题了,但是开发环境会跟着受影响。日志会写到不合理的文件夹里去,如果没有二级父目录,那么日志就直接没了。因此为了解决这个问题,我们需要一个能判断当前环境,并使用不同NLog配置文件的方法。

新建环境配置文件

首先,复制出一个用于开发环境的配置文件,如:nlog.debug.config,这种命名的好处在于,VS会自动将它nest到nlog.config下。

在我的例子里,只有日志路径是环境独立的。因此我需要在nlog.debug.config里针对开发环境,设置日志路径:

fileName="${basedir}\logs\${shortdate}.log"

加载环境配置文件

NLog加载配置文件的位置位于ASP.NET Core应用刚启动的时候:

public static void Main(string[] args)

{

var logger = NLogBuilder.ConfigureNLog("nlog.config").GetCurrentClassLogger();

// ...

}

然而这时候程序还没有加载依赖注入,用不了IHostingEnvironment,如何获取环境名称呢?

其实呢,ASP.NET Core的环境名称是通过一个名为 ASPNETCORE_ENVIRONMENT 的环境变量配置的,这在VS里可以通过工程属性看到:

所以就算我们还没有DI服务,我们可以这样硬搞:

Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");

它会返回环境名称的字符串值。对于最常用的环境名称,ASP.NET Core框架自己有一个预定义的文件:

namespace Microsoft.AspNetCore.Hosting

{

//

// Summary:

// Commonly used environment names.

public static class EnvironmentName

{

public static readonly string Development;

public static readonly string Staging;

public static readonly string Production;

}

}

在我的例子里,只要不是Production环境,我就要让NLog加载nlog.debug.config,所以这样写就OK啦:

public static void Main(string[] args)

{

var environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");

var isProd = environment == EnvironmentName.Production;

var logger = NLogBuilder.ConfigureNLog(isProd ? "nlog.config" : "nlog.debug.config").GetCurrentClassLogger();

}

现在,网站在Azure上能够将日志写入专用文件夹:

在本地debug的时候,写入网站根目录:

本文分享自微信公众号 - 汪宇杰博客(ediwangblog)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-03-30

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 倒计时:《Linux的任督二脉》之《内存管理》在线课程

    理解硬件访问内存的原理,MMU和页表;澄清Linux内核ZONE,buddy,slab管理;澄清用户空间malloc与内核关系,Lazy分配机制;澄清进程的内存...

    Linux阅码场
  • LeetCode 14 Longest Common Prefix

    ShenduCC
  • Mongo4.2分布式事务实现Overview

    在Mongos侧,每个OperationCtx会有一个TransactionRouter,记录事务上下文。

    MongoDB中文社区
  • LeetCode 13 Roman to Integer

    ShenduCC
  • linux下Clang和gcc的区别

    出错提示更友 好,比如 clang 在编译过程可以直接指出相对简单的出错位置以及它 “ 认为 ” 正确的方式 。

    Linux阅码场
  • 填坑!完结娱乐圈明星关系图谱

    娱乐圈明星关系图谱体验地址,建议先体验后阅读本文,或者先打开链接,等阅读完没准页面也加载好了(太卡警告!或者去B站看下录制的28s超短视频:超酷炫的娱乐圈明星关...

    古柳_DesertsX
  • C语言函数参数是如何传递的?

    我们可能听过C语言中的传值和传指针,在其他语言中,也有传引用一说,那么他们到底有什么区别呢?如果你还不能准确地分辨,就该好好了解一下了。

    诸葛青云
  • Akka-CQRS(8)- CQRS Reader Actor 应用实例

    前面我们已经讨论了CQRS-Reader-Actor的基本工作原理,现在是时候在之前那个POS例子里进行实际的应用示范了。

    用户1150956
  • 边缘计算笔记(三):从Tensorflow生成TensorRT引擎的方法(完结篇)

    例如我们想将训练好的Inception V1现成模型,从TensorFlow转换为TensorRT, 我们可以从(TensorBoard)显示的结构图的最发现找...

    GPUS Lady
  • 认识目标文件的符号

    符号是链接的粘合剂,没有符号无法完成链接。每一个目标文件都会有一个相应的符号表(Symbol Table),表里记录了目标文件用到的所有符号。

    Dabelv

扫码关注云+社区

领取腾讯云代金券