我正在用Powershell脚本编写一个函数,该函数会将条目写入日志文件,但是我无法以适当的布局进行操作。
function Write-Log {
[CmdletBinding()]
param (
[Parameter(Mandatory = $true)][string]$LogFile,
[Parameter(Mandatory = $true)][int16]$LogLevel,
[Parameter(Mandatory = $true)][string]$SiteURL,
[Parameter(Mandatory = $false)][int16]$ContentType,
[Parameter(Mandatory = $true)][string]$ListName,
[Parameter(Mandatory = $true)][string]$LogMessage
)
$LogEntry = New-Object PSObject
Add-Member -InputObject $LogEntry -MemberType NoteProperty -Name 'Timestamp' -Value [DateTime]::Now
Add-Member -InputObject $LogEntry -MemberType NoteProperty -Name 'LogLevel' -Value $global:LogLevel[$LogLevel]
Add-Member -InputObject $LogEntry -MemberType NoteProperty -Name 'SiteURL' -Value $SiteURL
Add-Member -InputObject $LogEntry -MemberType NoteProperty -Name 'ContentType' -Value $global:ContentType[$ContentType]
Add-Member -InputObject $LogEntry -MemberType NoteProperty -Name 'ListName' -Value $global:ContentType[$ListName]
Add-Member -InputObject $LogEntry -MemberType NoteProperty -Name 'LogMessage' -Value $global:ContentType[$LogMessage]
#$LogEntry = "[$([DateTime]::Now)]`t$($global:LogLevel[$LogLevel])`t$($LogMessage)`t$($global:ContentType[$ContentType])`t`t$($ListName)`t`t$($SiteURL)" | Format-Table -AutoSize
Add-Content -Path $LogFile -Value $LogEntry
}
显然,上面的功能正在将日志条目写入文本文件,但是格式很糟糕。我想要一种数组类型的布局,其中每个属性都与其列对齐。对于实例,我希望它看起来像这样:
Timestamp LogLevel SiteURL ContentType
--------- ------------ ------- -----------
[11/13/2019 09:19:06] INFO mysite.org Document
您能帮我做这个输出吗?
答案 0 :(得分:2)
为了将日志条目对象写入日志文件,我强烈建议使用Export-Csv
和制表符分隔的日志文件:
$LogEntry | Export-Csv 'C:\path\to\your.log' -Delimiter "`t" -Append -NoType
在(人类)可读性和可分析性之间始终存在一个权衡,而TSV(IMHO)是其中最合理的折衷方案。用户可以使用以下内容查看日志文件:
Import-Csv 'C:\path\to\your.log' -Delimiter "`t" | Out-GridView
但是,即使在文本编辑器中打开,它仍然可以被人类阅读。
如果必须具有固定列的输出文件,则可能需要执行以下操作(使用format operator):
'{0:yyyy-MM-dd HH:mm} {1,-8} {2,-20} {3,-20} {4,-20} {5}' -f $LogEntry.Timestamp, $LogEntry.LogLevel, $LogEntry.SiteURL, $LogEntry.ContentType, $LogEntry.ListName, $LogEntry.LogMessage