C# Microsoft.Extensions.Configuration值替换 动机
我有很多应用程序需要配置日志记录,如果可能的话,我想分享这些配置。然而,每个应用程序都使用不同的应用程序路径,我正在寻找一种方法,用进程名替换下面的C# Microsoft.Extensions.Configuration值替换 动机,c#,serilog,C#,Serilog,我有很多应用程序需要配置日志记录,如果可能的话,我想分享这些配置。然而,每个应用程序都使用不同的应用程序路径,我正在寻找一种方法,用进程名替换下面的$(ProcessName) { “Serilog”:{ “书面形式”:{ “文本文件”:{ “名称”:“文件”, “Args”:{ “路径”:“$(ProcessName).txt”, } } } } } 要求 我知道我可以在代码中重写“Serilog:WriteTo:TextFile:Args:path”,但这会将接收器名称固定为TextFil
$(ProcessName)
{
“Serilog”:{
“书面形式”:{
“文本文件”:{
“名称”:“文件”,
“Args”:{
“路径”:“$(ProcessName).txt”,
}
}
}
}
}
要求
我知道我可以在代码中重写“Serilog:WriteTo:TextFile:Args:path”
,但这会将接收器名称固定为TextFile
,并且无论接收器如何,它都将始终存在
实际上,我希望在Serilog使用Microsoft.Extensions.Configuration之前对其执行转换。热重新加载需要工作,因此一次性转换不起作用
尝试
公共类替换配置源:IConfigurationSource
{
私有只读IConfigurationSource\u内部;
私有只读IEnumerable\u替换;
...
公共IConfigurationProvider生成(IConfigurationBuilder构建器)=>新的替换配置提供程序(_inner.Build(builder),_substitutions);
}
公共类替换配置提供程序:IConfigurationProvider
{
私有只读IConfigurationProvider\u内部;
私有只读IEnumerable\u替换;
...
公共bool TryGet(字符串键,输出字符串值)
{
如果(!\u inner.TryGet(key,out value))返回false;
价值=替代(价值);
返回true;
}
私有字符串替换(字符串值)
{
foreach(var(key,val)在_替换中)
{
值=值。替换(键,val);
}
返回值;
}
}
IConfigurationBuilder configurationBuilder=new configurationBuilder();
configurationBuilder.Add(新替换ConfigurationSource(
//很遗憾,JSONConfiguration源找不到该文件。因此,停止使用此方法。
新JSONConfiguration源
{
FileProvider=configurationBuilder.GetFileProvider(),
Path=“serilog.json”
可选=假,
ReloadOnChange=true,
},
新的KeyValuePair[]
{
新的($(ProcessName)”,ProcessName,
}
)
)
.AddJsonFile(“appsettings.json”,true,true);
问题:
我无法想象自己是唯一一个寻找这个的人。我该怎么办?切换到另一种编程语言?有很多方法可以做到这一点。您是否使用Azure Devops、Octopus deploy等发布管道?这些工具能够在发布时转换配置。这在开发过程中有效吗?如果我能阻止它,我希望共享公共配置,而不是生成副本。不,在开发过程中,您有很多选择。我建议你,还有。您可以选择基于
ASPNETCORE_ENVIRONMENT
的配置,包括用户设置、环境变量和列表。我的问题与在不同环境中提供不同的配置无关。我有多个应用程序(20个),它们都需要配置日志记录,而不是生成20个配置文件,我希望这些应用程序导入一个公共配置文件。我希望公共配置文件能够使用进程名来指定日志文件路径。由于维护负担,不希望生成20个配置文件。