Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Microsoft.Extensions.Configuration值替换 动机_C#_Serilog - Fatal编程技术网

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之前对其执行转换。热重新加载需要工作,因此一次性转换不起作用

尝试
  • 创建我自己的配置源/提供程序(我知道这不是特定于serilog的),但我无法让它工作
  • 看一下ReloadToken,看看我是否可以编写一个处理程序,每当配置发生变化时,它都会重写配置,但是使用ReloadToken是非常不合理的
  • 配置源/提供程序包装的重要部分:

    公共类替换配置源: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个配置文件。