【发布时间】:2017-10-19 15:54:57
【问题描述】:
我有几个函数存储在一个 .psm1 文件中,供几个不同的 ps1 脚本使用。我创建了一个日志记录函数(如下所示),我在这些 ps1 脚本中都使用了它。通常,我通过简单地调用类似的东西在脚本中导入模块:
Import-Module $PSScriptRoot\Module_Name.psm1
然后在模块内,我有一个写记录器功能:
Write-Logger -Message "Insert log message here." @logParams
此函数在整个主脚本和模块本身中都使用。喷溅参数@logParams 在我的主 .ps1 文件中定义,并没有显式传递给模块,我想这些变量在导入时隐含在模块的范围内。我有什么作品,但我觉得这不是一个很好的做法。在我的模块中添加 param 块以要求从主 .ps1 脚本显式传递 @logParams 会更好吗?谢谢!
function Write-Logger() {
[cmdletbinding()]
Param (
[Parameter(Mandatory=$true)]
[string]$Path,
[Parameter(Mandatory=$true)]
[string]$Message,
[Parameter(Mandatory=$false)]
[string]$FileName = "Scheduled_IDX_Backup_Transcript",
[switch]$Warning,
[switch]$Error
)
# Creates new log directory if it does not exist
if (-Not (Test-Path ($path))) {
New-Item ($path) -type directory | Out-Null
}
if ($error) {
$label = "Error"
}
elseif ($warning) {
$label = "Warning"
}
else {
$label = "Normal"
}
# Mutex allows for writing to single log file from multiple runspaces
$mutex = new-object System.Threading.Mutex $false,'MutexTest'
[void]$mutex.WaitOne()
Write-Host "$(Format-LogTimeStamp) $label`: $message"
"$(Format-LogTimeStamp) $label`: $message" | Out-file "$path\$fileName.log" -encoding UTF8 -append
[void]$mutex.ReleaseMutex()
}
【问题讨论】:
-
您可以使用
$PSCommandPath自动变量,它将从调用脚本返回全名属性。我通常将其解析为基本名称并将其用作日志的名称。这只是在其他模块中使用日志记录功能时的问题,因为日志文件不会匹配。 -
@TheIncorrigible1 谢谢,这是创建日志的好建议。但是,我想我真正想问的是在导入的脚本中合并日志记录的最佳方式是什么?你如何传递日志路径、文件名等?在模块开头声明强制参数以进行日志记录是一种好习惯吗?另外,为了清楚起见,我编辑了原始问题。
-
在编程语言中记录日志的常用方法是拥有一个日志对象。因此,如果您使用 PowerShell 5+,或者您有 C# 经验,则可以定义一个记录器类对象并利用该对象本身将包含这些详细信息作为属性。
-
@mmartin712 我喜欢你对 Mutex 的使用,我计划将它(即窃取这个想法)合并到我用于通用日志记录的记录器类中(目前,我使用 do/while/sleep 例程) .我使用全局变量,我讨厌将它作为“答案”发布,但我认为它可能对你有用(所以无论如何我都会这样做......)。
标签: powershell logging