【问题标题】:How to ensure that a logging Cmdlet is called for every exception in a PowerShell script module?如何确保为 PowerShell 脚本模块中的每个异常调用日志记录 Cmdlet?
【发布时间】:2020-11-03 03:58:08
【问题描述】:

在 PowerShell(5.1 及更高版本)脚本模块中,我想确保抛出的每个脚本和系统异常都会调用日志记录 Cmdlet(例如 Write-Log)。我知道我可以将模块 Cmdlet 中的所有代码包装到 try/catch 块中,但我首选的解决方案是使用 trap 处理在执行模块的 Cmdlet 时引发的所有异常

trap { Write-Log -Level Critical -ErrorRecord $_ }

如果我将上述语句添加到模块内的每个 Cmdlet,则使用上述语句可以按预期工作,但我只想有一个 trap 语句来捕获模块的 Cmdlet 抛出的所有异常,以不复制代码并确保我不会错过任何 Cmdlet 中的声明。这可能吗?

【问题讨论】:

    标签: powershell exception logging error-handling


    【解决方案1】:

    我会这样做。

    • 根据需要设置多个Try/Catch block
    • 尽可能将多个 cmdlet 调用分组到同一块下。正如您所提到的,我们不想将所有内容归为 1 个巨大的 try/catch 块,但仍然可以将相关调用放在一起。
    • 将您的模块内函数设计为高级函数,这样您就可以使用常用参数,例如... -ErrorAction
    • 设置$PSDefaultParameterValues = @{'*:ErrorAction'='Stop'},这样所有支持-ErrorAction 的cmdlet 都不会落入try/catch 块。

    (您也可以在任何地方手动设置-ErrorAction Stop,但由于您希望将其设为默认值,因此这样做是有意义的。在任何情况下,您都不想触摸$ErrorActionPreference,因为它具有全局范围amd如果您在模块范围之外更改默认值,您的用户将不会喜欢您。)

    您还可以将错误流重定向到文件,这样它就不会出现在输出中,而是写入文件中。

    这是一个独立的例子:

    
    & {
        Write-Warning "hello"
        Write-Error "hello"
        Write-Output "hi"
    } 2>> 'C:\Temp\redirection.log'
    

    有关更多信息,请参阅:About_Redirection

    (现在我想知道您是否可以将流重定向到文件以外的其他内容

    补充说明

    外部模块也可以帮助记录日志,并且可能提供更简化的方法。 不过,我对他们中的任何一个都不熟悉。

    我知道PSFramework 有一些关于日志记录的有趣内容。 您可以查看并进行试验,看看是否符合您的需求。

    否则,您可以对 PSGallery 进行日志记录模块的研究 (这项研究远非完美,但有些候选人可能很有趣)

    find-module *logging* | Select Name, Description, PublishedDate,Projecturi | Sort PublishedDate -Descending

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-16
      • 2015-11-20
      • 2018-07-17
      • 2014-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多