1.配置文件的相关闲话
Core自身对于配置文件不是必须品,但由上文分析可知ASP.NET Core默认采用appsettings.json作为配置文件,关于配置信息的优先等级
命令行>环境变量>自我订制的配置(AddUserSecrets)>和当前环境相匹配的appsettings.json中的配置>大于appsettings.json中的配置
关于AddUserSecrets是什么这里简单一言以蔽之:每个开发人员有自己特性的配置数据,这些配置信息仅仅属于个人,不能提交给团队成员,
但是又不想不团队共有的配置所影响. 剩下的自行去了解,关键是上面的优先级
和当前环境相匹配的appsettings.json如appsettings.Development.json
2.日志配置的问题
系统默认采用Microsoft.Extensions.Logging系列套餐作为默认的日志组件,且采用配置文件中的Logging节点作为日志的默认配置参数依据。如下图所示:
日志的优先等级如下(从上到下依次递增)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
public
enum
LogLevel
{
// 含有最详细的日志数据,其中可能含有程序的一些敏感数据,该选项默认是被禁用的,且生产环境中绝对不要开启
// (太多,太敏感),之所以默认禁用在于appsettings.json中最低级别是Information
Trace = 0,
//调试用的一些数据
Debug = 1,
// 用于跟踪程序通常的流程数据,这些日志是一些长期的数据。
Information = 2,
// 需要引起重视的日志数据,不会导致程序崩溃
Warning = 3,
//发生了错误,但不会导致程序大范围崩溃
Error = 4,
// 严重且致命的错误
Critical = 5,
// 不是用来记录日志的. 通常用于设置默认值
None = 6
}
|
3.配置文件的读取
1)ASP.NET Core的Host采用appsettings.json作为配置文件,具体的值是多少受优先级的影响(看第一段)
2)Startup类中Host自动通过构造注入的方式提供了Configuration的值,Configuration读取方式介绍如下
ASP.NET Core中默认采用了Microsoft.Extensions.Configuration.Json作为配置解析器(publish一下就看到了里面有它)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
{
"Id"
:
"123"
,
"Logging"
: {
"IncludeScopes"
:
false
,
"LogLevel"
: {
"Default"
:
"Debug"
,
"System"
:
"Information"
,
"Microsoft"
:
"Information"
}
},
"UserList"
: [
{
"Name"
:
"Name1"
},
{
"Name"
:
"Name2"
},
{
"Name"
:
"Name3"
}
]
}
|
3.通过Key进行读取
1
2
3
4
|
Configuration[
"Id"
];
// 123
Configuration[
"Logging:IncludeScopes"
];
// false
Configuration[
"Logging:LogLevel:Default"
];
// Debug
Configuration[
"UserList:0:Name"
];
// Name1
|
上面这些值都是string类型的,我们可以通过GetValue来获取指定类型的值
如下
Configuration.GetValue<int>("Id"); // int类型的123 Configuration.GetValue<bool>("Logging:IncludeScopes"); // bool 类型 false Configuration.GetValue<string>("Logging:LogLevel:Default"); // string 类型 Debug Configuration.GetValue<string>("UserList:0:Name"); // string 类型 Name1
4.通过POCO(纯C#对象)类来获取配置信息(这里以Get方法为例)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
public
class
Poco
{
public
int
Id {
get
;
set
; }
public
LoggingPoco Logging {
get
;
set
; }
public
List<User> UserList {
get
;
set
; }
public
class
User
{
public
string
Name {
get
;
set
; }
}
}
public
class
LoggingPoco
{
public
bool
IncludeScopes {
get
;
set
; }
public
LogLevelPoco LogLevel {
get
;
set
; }
}
public
class
LogLevelPoco
{
public
string
Default {
get
;
set
; }
public
string
System {
get
;
set
; }
public
string
Microsoft {
get
;
set
; }
}
var
detailLogging = Configuration.GetSection(
"Logging"
).Get<LoggingPoco>();
|
获取整个配置文件的配置信息
var allConfig = Configuration.Get<Poco>();
获取指定节点下的配置内容
var logging = Configuration.GetSection("Logging").Get<LoggingPoco>();
说说优先级最高的配置(命令行方式)
前文所述,命令行具有优先级最高的配置权力,命令行传入A的值的方式:
1
2
3
4
5
6
|
//core特有的传入方式,没有引号就会因空格截断
dotnet app.dll /A=
"Value in CMD"
//传统的方式,没有引号就会因空格截断
dotnet app.dll --A
"Value in CMD"
|
1
|
dotnet app.dll A=
"Value in CMD"
|
环境变量的传值方式
环境变量的等级仅次于命令行,另外windows当前用户的环境变量有限等级高于系统环境变量,windows环境变量可能重启后才能生效;
主要的应用场景在于docker等
内存性配置方式
主要用于加密保护一些敏感配置数据.