Write-ToLog in PowerShell
La funzione PowerShell Write-ToLog permette di scrivere su un file di log testuale e, contemporaneamente, in console
Per utilizzarla è sufficiente richiamare funzione Write-ToLog:
in questo caso scrivo un messaggio di log sulla console (in rosso) e su un file definito con Set-ToLog.
Questo è il risultato:
Il nome di default del file di log è SgartIT_yyyyMMdd.log e viene scritto nel percorso corrente ($pwd).
Il prefisso SgartIT può essere cambiato tramite la funzione:
Si possono usare anche gli switch NoHost e NoFile rispettivamente per NON scrivere sulla console e NON' scrivere su file:
in questo caso scrivo il messaggio solo su file.
come prima cosa va inizializzato il log con Set-ToLog
il parametro Period può assumere uno di questi valori: Montly, Daily, Hourly, Time, Unique e UniqueWithTime.
PowerShell: Write-ToLog
function Write-ToLog {
Param (
[parameter(Mandatory=$true, HelpMessage="Message string")]
[ValidateNotNullOrEmpty()]
[string] $message,
[parameter(HelpMessage="Foreground color message")]
[AllowEmptyString()]
[string] $ForegroundColor='white',
[parameter(HelpMessage="Do not write on the console")]
[switch]$NoHost = $false,
[parameter(HelpMessage="Do not write on the file log")]
[switch]$NoFile = $false
)
$m = "$(get-date): $message"
if($WriteToLogFullFileName -eq $null){
Set-ToLog "SgartIT"
}
if($NoFile -eq $false) {
$m >> $WriteToLogFullFileName
}
if($NoHost -eq $false) {
Write-Host $m -ForegroundColor $foregroundColor
}
}
function Set-ToLog {
Param (
[parameter(Mandatory=$true, HelpMessage="Enter the file name of log file witout extension")]
[ValidateNotNullOrEmpty()]
[string] $fileName
)
Set-Variable -Name WriteToLogFileName -Value $fileName -Scope Script -Visibility public
Set-Variable -Name WriteToLogFullFileName -Value "$pwd\$WriteToLogFileName`_$(get-date -Format yyyMMdd).log" -Scope Script -Visibility public
}
Per utilizzarla è sufficiente richiamare funzione Write-ToLog:
PowerShell
Write-ToLog "mio messaggio" -ForegroundColor red
Questo è il risultato:
DOS / Batch file
09/13/2013 12:53:37: mio messaggio
Il nome di default del file di log è SgartIT_yyyyMMdd.log e viene scritto nel percorso corrente ($pwd).
Il prefisso SgartIT può essere cambiato tramite la funzione:
PowerShell
Set-ToLog "nuovo prefisso del file"
PowerShell
Write-ToLog "mio messaggio" -NoHost
Variante
Questa è una variante della funzione Write-ToLog che permette di scegliere ogni quanto creare un nuovo file di log (mensilmente, giornalmente, ogni ora, con file name univoco) tramite la funzione Get-FileNameWithDatePowerShell: Write-ToLog enhanced
function Write-ToLog {
Param (
[parameter(Mandatory = $true, HelpMessage = "Message string")]
[ValidateNotNullOrEmpty()]
[string] $message,
[parameter(HelpMessage = "Foreground color message")]
[AllowEmptyString()]
[string] $ForegroundColor = 'white',
[parameter(HelpMessage = "Do not write on the console")]
[switch]$NoHost = $false,
[parameter(HelpMessage = "Do not write on the file log")]
[switch]$NoFile = $false
)
$m = "$(get-date -Format "yyyy-MM-dd HH:mm:ss") $message"
if ($null -eq $WriteToLogFullFileName) {
Set-ToLog
}
if ($NoFile -eq $false) {
$m >> $WriteToLogFullFileName
}
if ($NoHost -eq $false) {
Write-Host $m -ForegroundColor $foregroundColor
}
}
function Get-FileNameWithDate {
param (
[Parameter(Mandatory = $true, HelpMessage = "Prefix for file name")]
[string] $filePrefix,
[parameter(HelpMessage = "Period for create a new file")]
[ValidateSet("Montly", "Daily", "Hourly", "Time", "Unique", "UniqueWithTime")]
[string] $period = "Daily",
[parameter(HelpMessage = "File extension")]
[string] $extension = "txt"
)
if ($period -eq "Hourly") {
$dtString = (get-date -Format "yyyyMMdd-HH");
}
elseif ($period -eq "Montly") {
$dtString = (get-date -Format "yyyyMM");
}
elseif ($period -eq "Time") {
$dtString = (get-date -Format FileDateTime);
}
elseif ($period -eq "Unique") {
$dtString = "$([System.Guid]::NewGuid().toString("N"))";
}
elseif ($period -eq "UniqueWithTime") {
$dtString = "$(get-date -Format "yyyyMMdd-HHmmss")-$([System.Guid]::NewGuid().toString("N"))";
}
else {
$dtString = (get-date -Format FileDate); # yyyyMMdd
}
# return value
"$($filePrefix)_$dtString.$extension"
}
function Set-ToLog {
Param (
[parameter(HelpMessage = "Enter the prefix of file name")]
[string] $filePrefix = "sgart",
[parameter(HelpMessage = "Enter the path of folder logs")]
[string] $path = "$pwd\logs",
[parameter(HelpMessage = "Period for create a new file")]
[ValidateSet("Montly", "Daily", "Hourly", "Time", "Unique", "UniqueWithTime")]
[string] $period = "Daily"
)
if ((Test-Path $path) -eq $false) {
New-Item -ItemType "directory" -Path $path
}
$fileName = Get-FileNameWithDate -filePrefix $filePrefix -Period $period -Extension "log"
Set-Variable -Name WriteToLogFullFileName -Value "$path\$fileName" -Scope Script -Visibility public
}
PowerShell: Initialize
$ScriptNameNoExtension = [System.IO.Path]::GetFileNameWithoutExtension($PSCommandPath)
Set-ToLog $ScriptNameNoExtension "$PSScriptRoot\logs" -Period Hourly