动机
我有许多应用程序要为其配置日志记录,如果可能的话,我希望共享该配置。然而,每个应用程序都使用不同的应用程序路径,我正在寻找用进程名替换下面的$(ProcessName)的方法。
{
"Serilog": {
"WriteTo": {
"TextFile": {
"Name": "File",
"Args": {
"path": "$(ProcessName).txt",
}
}
}
}
}要求
我知道我可以在代码中重写"Serilog:WriteTo:TextFile:Args:path",但这会将接收器名称修改为TextFile,而且无论接收器是什么,它都将始终存在。
本质上,我希望在Serilog使用它之前在Microsoft.Extensions.Configuration上执行转换。热重装需要工作,所以一次转换不起作用。
尝试
。
配置源/提供者包装器的重要部分:
public class SubstitutionConfigurationSource : IConfigurationSource
{
private readonly IConfigurationSource _inner;
private readonly IEnumerable<KeyValuePair<string, string>> _substitutions;
...
public IConfigurationProvider Build(IConfigurationBuilder builder) => new SubstitutionConfigurationProvider(_inner.Build(builder), _substitutions);
}
public class SubstitutionConfigurationProvider: IConfigurationProvider
{
private readonly IConfigurationProvider _inner;
private readonly IEnumerable<KeyValuePair<string, string>> _substitutions;
...
public bool TryGet(string key, out string value)
{
if (!_inner.TryGet(key, out value)) return false;
value = Substitute(value);
return true;
}
private string Substitute(string value)
{
foreach (var (key, val) in _substitutions)
{
value = value.Replace(key, val);
}
return value;
}
}IConfigurationBuilder configurationBuilder = new ConfigurationBuilder();
configurationBuilder.Add(new SubstitutionConfigurationSource(
// The JsonConfigurationSource can't find the file unfortunately. Stopped persuing this approach because of it.
new JsonConfigurationSource
{
FileProvider = configurationBuilder.GetFileProvider(),
Path = "serilog.json"
Optional = false,
ReloadOnChange = true,
},
new KeyValuePair<string, string>[]
{
new ("$(ProcessName)", processName),
}
)
)
.AddJsonFile("appsettings.json", true, true);问题
我无法想象我自己是唯一一个寻找这个的人。我该怎么做?切换到另一种编程语言?
发布于 2022-01-09 11:06:16
您可以执行我所做的工作,并使用我在代码中手动设置的环境变量:
// Set environmental variables that can be used inside appSettings.json
Environment.SetEnvironmentVariable("CUROUTDIR", OPGPathManager.CurrentOutputDirectory);
var processName = Process.GetCurrentProcess().ProcessName;
Environment.SetEnvironmentVariable("PROCESSNAME", PathHelpers.ReplaceInvalidChars(processName, '_'));只需在加载配置之前运行该代码即可。然后你可以做这样的事情:
"path": "%CUROUTDIR%\\..\\Logs\\%PROCESSNAME%\\%PROCESSNAME% .txt",编辑:奇怪的是,我找不到任何关于appsettings.json能够扩展env的文档。像这样的变数。这可能是serilog的一个特性,或者只是一般的应用程序设置--但这对于我的serilog文件接收器来说是可行的。
还有一些替代库可以处理这类事情,比如:
https://stackoverflow.com/questions/67304445
复制相似问题