如何捕获dbatools输出并通过Write-PSFMessage写入日志文件
dbatools命令输出捕获并写入PSFramework日志的实现方式
dbatools全系列命令本身基于PSFramework开发,执行时返回的结构化结果、过程提示、报错信息都可以通过以下方式写入日志:
- 直接捕获命令返回的结构化结果写入日志
Import-DbaCsv执行完成后会返回包含导入行数、耗时、错漏行统计的结果对象,直接将结果赋值给变量后,序列化传入Write-PSFMessage即可:# 接收命令返回的执行结果 $importResult = Import-DbaCsv -Path $_.FullName -SqlInstance $server -Database $DataBase -Table tempdata -schema dev -Delimiter "|" # 序列化结果后写入日志,可根据日志级别需求调整Level参数,可选值包括Verbose、Host、Output、Warning等 Write-PSFMessage -Level Verbose -Message "CSV导入任务执行完成,执行详情:`n$($importResult | ConvertTo-Json -Depth 5)" - 全量捕获执行过程所有控制台输出分流写日志
如果需要把命令执行过程中输出的进度提示、警告、详细报错、非结构化控制台文本全部记录,可以用PowerShell原生流重定向语法捕获所有输出流,再按内容类型分流写入对应级别的日志:# 将命令所有输出流(错误、警告、详细信息、调试信息等)全部重定向到标准输出流,存入变量 $fullOutput = Import-DbaCsv -Path $_.FullName -SqlInstance $server -Database $DataBase -Table tempdata -schema dev -Delimiter "|" *>&1 # 遍历输出项,按类型匹配对应日志级别写入 foreach ($item in $fullOutput) { switch ($item.GetType().Name) { "ErrorRecord" { Write-PSFMessage -Level Error -Message "CSV导入出错:$($item.Exception.Message)" -ErrorRecord $item } "WarningRecord" { Write-PSFMessage -Level Warning -Message "CSV导入警告:$($item.Message)" } "VerboseRecord" { Write-PSFMessage -Level Verbose -Message $item.Message } default { Write-PSFMessage -Level Host -Message "CSV导入输出:$item" } } } - 零捕获成本的自动日志方案
因为dbatools原生对接PSFramework日志体系,不需要手动捕获单条命令的输出,只需要在脚本开头提前配置PSFramework的文件日志规则,后续所有dbatools命令的执行细节、返回结果、报错信息都会自动写入指定日志文件:# 配置日志存放路径、保留周期、记录级别 Set-PSFConfig -FullName PSFramework.Logging.FileSystem.LogPath -Value "D:\DBOperationLogs\" Set-PSFConfig -FullName PSFramework.Logging.FileSystem.LogRetentionTime -Value (New-TimeSpan -Days 30) Set-PSFConfig -FullName PSFramework.Message.Info.Maximum -Level Verbose # 启用文件系统日志提供程序,开启自动记录 Register-PSFLoggingProvider -Name filesystem
提示:开启自动日志后,不需要对单条命令做任何输出捕获改造,适合批量数据导入场景下的全链路日志留痕,日志内容会自动包含执行时间、执行账号、命令参数、返回结果等全量信息。
内容的提问来源于stack exchange,提问作者user13520940
相关产品推荐
相关产品推荐

