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

点击上方蓝字关注“汪宇杰博客”

ab4282895c7d34bdd27c9832ab0268d6.png

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

aeb0ba454ca88ea7ecf61a6bb30f73ea.gif

怎么会有这种想法

首先,这个需求的背景,依然来源于我自己的博客系统(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下。

41e23a369274df3241bfe50fed1e7846.png

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

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

978bc810a6dc6ff738f7b7cb63924042.gif

加载环境配置文件

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

public static void Main(string[] args)

{

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

// ...

}

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

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

018d98f5a622536a0f8451133ec08d1e.png

所以就算我们还没有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上能够将日志写入专用文件夹:

19446b659d27224c6805151c10991bba.png

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

e9f4f1e639ccbe3787ed5e03afd838af.png 77626950a666c87ef0f7baae889a92be.gif
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值