本文将简单介绍在 dotnet 6 下的 ASP.NET Core 里的环境变量当成配置的优先级行为。这部分内容在官方文档都有提到,只是我开始粗心没有看仔细,而踩到了坑,特意写篇博客记录一下

在 ASP.NET Core 环境变量和 appsettings.json 文件的优先级从高到低如下:

  • 不带 ASPNETCORE_ 前缀的环境变量
  • appsettings.json
  • ASPNETCORE_ 前缀的环境变量

本文将使用日志配置作为例子来告诉大家 ASP.NET Core 的行为

在默认的项目配置里面,存放在 appsettings.json 文件里面有关于日志的默认配置,代码如下

{
"Logging":
{
"LogLevel":
{
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*"
}

通过以上的 "Microsoft.AspNetCore": "Warning" 日志配置可以知道,如果创建了使用 Microsoft.AspNetCore 前缀的 CategoryName 的 ILogger 日志,那么这个日志只有大于等于 Warning 等级的日志才能输出。而创建了其他前缀的 CategoryName 的 ILogger 日志,将可以采用 "Default": "Information" 配置,让大于等于 Information 等级的日志进行输出

如在 Program.cs 编写以下代码,尝试进行日志输出

// 配置输出到 VisualStudio 调试界面
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddLogging(loggingBuilder => loggingBuilder.AddDebug()); var app = builder.Build(); app.MapGet("/", () => "Hello World!"); var serviceProvider = app.Services; var loggerFactory = serviceProvider.GetRequiredService<ILoggerFactory>();
var logger1 = loggerFactory.CreateLogger(categoryName: "Microsoft.AspNetCore.Foo");
logger1.LogInformation($"Logger1 LogInfo");
logger1.LogWarning($"Logger1 LogWarning"); var logger2 = loggerFactory.CreateLogger("Microsoft.Foo");
logger2.LogInformation($"Logger2 LogInfo");
logger2.LogWarning($"Logger2 LogWarning");

此时符合预期的就是 logger1 只输出 Warning 信息,而 logger2 输出两条日志。运行程序,在 VisualStudio 的调试输出窗口可以看到以下输出

Microsoft.AspNetCore.Foo: Warning: Logger1 LogWarning
Microsoft.Foo: Information: Logger2 LogInfo
Microsoft.Foo: Warning: Logger2 LogWarning

接下来尝试设置环境变量修改其优先级,根据官方文档可以知道,环境变量设置里面使用 __ 代替 : 符号,即在设置 Logging:LogLevel:Microsoft.AspNetCore 时可以采用 Logging__LogLevel__Microsoft.AspNetCore 这样的 Key 进行设置

设置环境变量的另一个方式是通过在环境变量前面加上 ASPNETCORE_ 前缀,换句话可以使用 ASPNETCORE_Logging__LogLevel__Microsoft.AspNetCore 这样的配置

通过本文开始可以知道的是环境变量这两个不同的格式和 appsettings.json 文件的优先级不同。带 ASPNETCORE_ 前缀的环境变量优先级低于不带的 ASPNETCORE_ 前缀和配置文件的

为了测试环境变量,自然不能让大家去改本机的环境变量了,只需要在 VisualStudio 调试配置里面编辑即可,可以直接编辑项目的 Properties\launchSettings.json 文件,如本文的测试例子,修改为如下代码

{
"profiles":
{
"IIS Express":
{
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables":
{
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"配置文件 1":
{
"commandName": "Project",
"environmentVariables":
{
"ASPNETCORE_ENVIRONMENT": "Development",
"ASPNETCORE_Logging__LogLevel__Microsoft.AspNetCore": "Debug",
"Logging__LogLevel__Microsoft": "Warning"
},
"dotnetRunMessages": true,
"applicationUrl": "http://localhost:5124"
},
"配置文件 2":
{
"commandName": "Project",
"environmentVariables":
{
"ASPNETCORE_ENVIRONMENT": "Development",
"Logging__LogLevel__Microsoft.AspNetCore": "Debug",
"ASPNETCORE_Logging__LogLevel__Microsoft": "Warning"
},
"dotnetRunMessages": true,
"applicationUrl": "http://localhost:5124"
}
},
"iisSettings":
{
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress":
{
"applicationUrl": "http://localhost:54586",
"sslPort": 0
}
}
}

修改 Program.cs 代码如下

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddLogging(loggingBuilder => loggingBuilder.AddDebug()); var app = builder.Build(); app.MapGet("/", () => "Hello World!"); var logLevelConfiguration = app.Configuration.GetSection("Logging").GetSection("LogLevel");
var configuration1 = logLevelConfiguration["Microsoft.AspNetCore"];
var configuration2 = logLevelConfiguration["Microsoft"]; // 配置文件 1:
// configuration1 = Warning
// configuration2 = Warning // 配置文件 2:
// configuration1 = Debug
// configuration2 = Warning var serviceProvider = app.Services; var loggerFactory = serviceProvider.GetRequiredService<ILoggerFactory>();
var logger1 = loggerFactory.CreateLogger(categoryName: "Microsoft.AspNetCore.Foo");
logger1.LogInformation($"Logger1 LogInfo");
logger1.LogWarning($"Logger1 LogWarning"); var logger2 = loggerFactory.CreateLogger("Microsoft.Foo");
logger2.LogInformation($"Logger2 LogInfo");
logger2.LogWarning($"Logger2 LogWarning"); //app.Run(); Console.Read();

尝试切换配置文件 1 测试其行为,可以看到在配置文件 1 的 VisualStudio 控制台输出如下

Microsoft.AspNetCore.Foo: Warning: Logger1 LogWarning
Microsoft.Foo: Warning: Logger2 LogWarning

这是因为在配置1里面的配置分别是 "ASPNETCORE_Logging__LogLevel__Microsoft.AspNetCore": "Debug""Logging__LogLevel__Microsoft": "Warning" 导致了 Microsoft.AspNetCore 的配置优先级低于配置文件的配置,从而没有成功赋值上 Debug 等级

切换到配置文件 2 测试其行为,可以看到在配置文件 2 的 VisualStudio 控制台输出如下

Microsoft.AspNetCore.Foo: Information: Logger1 LogInfo
Microsoft.AspNetCore.Foo: Warning: Logger1 LogWarning
Microsoft.Foo: Warning: Logger2 LogWarning

可以看到 Logger1 输出了 Info 和 Warning 等级的日志,这就表示了通过 Logging__LogLevel__Microsoft.AspNetCore 环境变量设置的配置的优先级高于配置文件

以上测试代码放在githubgitee 欢迎访问

可以通过如下方式获取本文的源代码,先创建一个名为 JayabawwiWhenenearfajay 的空文件夹,接着使用命令行 cd 命令进入此空文件夹,在命令行里面输入以下代码,即可获取到本文的代码

git init
git remote add origin https://gitee.com/lindexi/lindexi_gd.git
git pull origin 91debf6e102bb11f8ecfd290c0951827744254d2

以上使用的是 gitee 的源,如果 gitee 不能访问,请替换为 github 的源。请在命令行继续输入以下代码

git remote remove origin
git remote add origin https://github.com/lindexi/lindexi_gd.git
git pull origin 91debf6e102bb11f8ecfd290c0951827744254d2

获取代码之后,进入 JayabawwiWhenenearfajay 文件夹

ASP.NET Core 浅析环境变量与配置的优先级的更多相关文章

  1. ASP.NET Core使用环境变量

    前言 通常在应用程序开发到正式上线,在这个过程中我们会分为多个阶段,通常会有 开发.测试.以及正式环境等.每个环境的参数配置我们会使用不同的参数,因此呢,在ASP.NET Core中就提供了相关的环境 ...

  2. ASP .NET CORE 根据环境变量支持多个 appsettings.json

    0.背景 在开发项目的过程当中,生产环境与调试环境的配置肯定是不一样的.拿个最简单的例子来说,比如连接字符串这种东西,调试环境肯定是不能连接生产数据库的.在之前的话,这种情况只能说是你 COPY 两个 ...

  3. .net core 中环境变量的配置

    配置文件: Properties目录下的launchSettings.json IISExpress配置 "ASPNET_ENV": "EnvironmentOne&qu ...

  4. ASP.NET Core根据环境切换NLog配置

    1.新建NLog配置文件,名称分别为nlog.config和nlog.debug.config <?xml version="1.0"?> <nlog xmlns ...

  5. ASP.NET Core 根据环境变量支持多个 appsettings.json配置文件 (开发和生产)

    新建一个项目,web根目录会出现一个 appsettings.json  配置文件, 此时添加--新建项,输入  appsettings.Development.json 再新增一个,appsetti ...

  6. ASP.NET Core 从 gitlab-ci 环境变量读取配置

    最近在加强持续集成,遇到一个场景需要通过 gitlab-ci 环境变量(Settings -> Settings -> CI/CD -> Variables )在持续集成时向 ASP ...

  7. ASP.NET Core macOS 环境配置 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core macOS 环境配置 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 是对 ASP.NET 有重大意义的一次重新设计.本章节我 ...

  8. ASP.NET Core Windows 环境配置 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core Windows 环境配置 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core Windows 环境配置 ASP.NET Core ...

  9. .NET CORE学习笔记系列(3)——ASP.NET CORE多环境标识

    在开发项目的过程当中,生产环境与调试环境的配置是不一样的.比如连接字符串. ASP .NET CORE 支持利用环境变量来动态配置 JSON 文件.ASP.NET Core 引用了一个特定的环境变量  ...

  10. ASP.NET Core 1.0 基础之配置

    来源https://docs.asp.net/en/latest/fundamentals/configuration.html ASP.NET Core 1.0支持不同的配置选项.应用配置数据可以是 ...

随机推荐

  1. 三维模型3DTile格式轻量化压缩处理重难点分析

    三维模型3DTile格式轻量化压缩处理重难点分析 在对三维模型3DTile格式进行轻量化压缩处理的过程中,存在一些重要而又困难的问题需要解决.以下是几个主要的重难点: 1.压缩率和模型质量之间的平衡: ...

  2. Linux快速入门(七)效率工具(Vim)

    Vim编辑器 所有的Linux系统都会内建一个Vi文本编辑器,而Vim是从Vi发展出来的一个高度可配置的文本编辑器,旨在高效的创建和更改任何类型的文本,它还可以根据文件的扩展名判别编程语言. 使用方式 ...

  3. vue项目本地开发完成后部署到服务器后报404是什么原因呢?

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 一.如何部署 前后端分离开发模式下,前后端是独立布署的,前端只需要将最后的构建物上传至目标服务器的web容器指定的静态目录下即可 我们知道 ...

  4. 任何样式,javascript都可以操作,让你所向披靡

    前言 习惯了在 css 文件里面编写样式,其实JavaScript 的 CSS对象模型也提供了强大的样式操作能力, 那就随文章一起看看,有多少能力是你不知道的吧. 样式来源 客从八方来, 样式呢, 样 ...

  5. 《Effective Java》笔记 4~5

    4. 类和接口 15. 使类和成员的可访问性最小化 把API与实现清晰地隔离开,组件间通过API进行通信,不需要知道其他模块的内部工作情况,这称为:实现信息隐藏或封装 解耦系统中的各个组件 尽可能地使 ...

  6. java 计算两个date日期相差天数或者时间差

    相差天数计算: /** * 相差天数计算 */ public int differentDaysByMillisecond(Date date1, Date date2) { return Math. ...

  7. python 处理国家标准行业编码(编码·门类·大类·中类·小类)

    进度 今天完整地进行了行业维度的清洗分析,把行业代码根据国家标准清洗出格式为  "编码·门类·大类·中类·小类"  的数据格式 过程 1.先把国家标准编码转化为json数据 2.根 ...

  8. MySQL数据库维护和改善性能

    备份数据   由于MySQL数据库是基于磁盘的文件,普通的备份系统和例程就能备份MySQL的数据.但是,由于这些文件总是处于打开和使用状态,普通的文件副本备份不一定总是有效.下面列出这个问题的可能解决 ...

  9. 准备Python环境学习OpenCV的使用

    安装venv模块,执行如下命令: sudo apt-get install python3-venv 创建venv环境,命名为images,执行如下命令: python3 -m venv images ...

  10. OpenHarmony社区运营报告(2023年6月)

      本月快讯 • 6月12日,以"OpenHarmony共建开放,共享未来"为主题的2023开放原子全球开源峰会OpenAtom OpenHarmony(以下简称"Ope ...