You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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"

关键说明

  1. 动态定位File sink:使用Where-Object筛选Name为File的节点,避免依赖固定索引导致的潜在错误
  2. 索引写法参考:如果一定要用索引定位,正确写法是$config.Serilog.WriteTo[1].Args.path
  3. JSON序列化深度:ConvertTo-Json -Depth 10确保嵌套的Serilog配置结构能完整序列化,避免被截断

内容的提问来源于stack exchange,提问作者Ariel Ch

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 10:37:31