在Powershell中将输出格式化为日志文件

时间:2019-11-13 08:48:48

标签: powershell file logging

我正在用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

您能帮我做这个输出吗?

1 个答案:

答案 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