如何用PowerShell修改JSON文件中Serilog的日志路径?
用PowerShell修改Serilog日志文件路径
原始配置与脚本
你的Serilog JSON配置:
{"Serilog": {"Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.File" ],"MinimumLevel": "Information","WriteTo": [{"Name": "Console","Args": {"outputTemplate": "[{Timestamp:HH:mm:ss} {SourceContext} [{Level}] {Message}{NewLine}{Exception}"}},{"Name": "File","Args": {"path": "logs/log.txt","outputTemplate": "[{Timestamp:HH:mm:ss} {SourceContext} [{Level}] {Message}{NewLine}{Exception}","formatter": {"type": "Serilog.Formatting.Compact.CompactJsonFormatter, Serilog.Formatting.Compact"},"rollingInterval": "Day","rollOnFileSizeLimit": true,"fileSizeLimitBytes": 104857600}}],"Properties": {"Application": "Serilog Demo"}}}
现有的PowerShell修改连接字符串脚本:
function update_ConnStr{ param ([string]$jsonFile) $a = Get-Content $jsonFile | ConvertFrom-Json $a.ConnectionStrings.DefaultConnection = "server=$($updServer);port=$($updPort);database=$($updDatabase);uid=$($updUid);password=$($updPwd)" ($a | ConvertTo-Json -depth 10 ) -replace "\u0027", "'" | Out-File -FilePath $jsonFile } $updServer=$env:DATABASE_HOST $updPort=$env:DATABASE_PORT $updDatabase=$env:DATABASE_NAME $updUid=$env:DATABASE_USERNAME $updPwd=$env:DATABASE_PASSWORD update_ConnStr("..\src\s----\appsettings.Production.json");
问题修正与解决方案
你尝试的$a.Serilog.WriteTo[2].Args.path存在两个问题:
- PowerShell数组索引从0开始,File sink是WriteTo数组的第二个元素,正确索引应为
1 - 硬编码索引不够可靠,若WriteTo节点顺序变化会导致修改失败,建议通过
Name属性定位File sink
修改后的脚本(整合日志路径修改)
function update_AppSettings{ param ( [string]$jsonFile, [string]$newLogPath ) # 读取并解析JSON配置 $config = Get-Content $jsonFile | ConvertFrom-Json # 保留原有连接字符串修改逻辑 $config.ConnectionStrings.DefaultConnection = "server=$($updServer);port=$($updPort);database=$($updDatabase);uid=$($updUid);password=$($updPwd)" # 定位Serilog的File输出节点并修改路径 $fileSink = $config.Serilog.WriteTo | Where-Object { $_.Name -eq "File" } if ($fileSink) { $fileSink.Args.path = $newLogPath } # 序列化回JSON并写入文件,处理单引号转义问题 ($config | ConvertTo-Json -Depth 10) -replace "\u0027", "'" | Out-File -FilePath $jsonFile } # 环境变量赋值(保留原有逻辑) $updServer=$env:DATABASE_HOST $updPort=$env:DATABASE_PORT $updDatabase=$env:DATABASE_NAME $updUid=$env:DATABASE_USERNAME $updPwd=$env:DATABASE_PASSWORD # 调用函数,传入目标JSON路径和新的日志文件路径 update_AppSettings -jsonFile "..\src\s----\appsettings.Production.json" -newLogPath "D:/app-logs/demo.log"
关键说明
- 动态定位File sink:使用
Where-Object筛选Name为File的节点,避免依赖固定索引导致的潜在错误 - 索引写法参考:如果一定要用索引定位,正确写法是
$config.Serilog.WriteTo[1].Args.path - JSON序列化深度:
ConvertTo-Json -Depth 10确保嵌套的Serilog配置结构能完整序列化,避免被截断
内容的提问来源于stack exchange,提问作者Ariel Ch
相关产品推荐
相关产品推荐

