À l'image du chien qui est le meilleur ami de l'homme, le fichier de log est le meilleur ami de l'informaticien qui débug.
Générer des logs lorsqu'un code PowerShell s'exécute permet de savoir si une fonction a été correctement exécutée et si ce n'est pas le cas de savoir précisément à quel endroit un problème est survenu, ce qui va sans dire est d'une aide considérable lors d'un débug.
La fonction de log
function Get-CurrentLineNumber #Fonction qui permet de récupérer la ligne actuelle dans un script, elle sera utilisée par le script qui appelle la fonction de log
{
Return $MyInvocation.ScriptLineNumber
}
function Write-Log #Fonction qu'il faudra appeler lorsque l'on voudra faire du logging
{
[CmdletBinding()] #Déclaration des paramètres qu'il faudra fournir à la fonction pour qu'elle puisse s'exécuter
param
(
[Parameter(Mandatory=$true)] #Indique que ce paramètre est obligatoire
[ValidateNotNullOrEmpty()] #Indique que ce champ ne peut pas être vide ou null
[string]$LogFile, #Paramètre qui contient le chemin complet du script qui appelle la fonction de log
[Parameter(Mandatory=$true)]
[ValidateNotNullOrEmpty()]
[string]$LogLine, #Paramètre qui contient la ligne à laquelle la fonction de log est appelée
[Parameter(Mandatory=$true)]
[ValidateNotNullOrEmpty()]
[string]$LogMessage, #Paramètre qui contient le log
[Parameter(Mandatory=$false)]
[ValidateNotNullOrEmpty()]
[string]$LogPath, #Paramètre qui contient le chemin complet du fichier de log
[Parameter(Mandatory=$true)]
[ValidateNotNullOrEmpty()]
[ValidateSet('Information','Warning','Error')] #Valeurs disponibles pour qualifier le log
[string]$LogSeverity #Paramètre qui va quantifier la nature du log parmi les valeurs disponibles
)
Begin
{
if (!$LogPath) #Code qui permet de générer un dossier de log ainsi que le fichier de log de façon dynamique si le paramètre LogPath est vide
{
$CurrentDateFormatForLog = Get-Date -Format "yyyy-MM-dd_HH" #Recupère la date du jour pour la mettre à la fin du nom de fichier de log
$LogFolderName = "Logs" #Nom du fichier de log
$LogFolderPath = $PSScriptRoot + "\" + $LogFolderName #Détermine dynamiquement la localisation du dossier de log qui doit se trouver dans le même dossier que le script PowerShell qui appelle la fonction de log
if (!(Test-Path -Path $LogFolderPath))#Vérifie l'existence d'un dossier de log dans le même dossier que le script qui appelle la fonction de log
{
New-Item -ItemType Directory -Path $LogFolderPath | Out-Null #Si le dossier de log n'existe pas, le créé
}
$LogPath = $LogFolderPath + "\" + "Log_" + $CurrentDateFormatForLog + ".csv" #Détermine le nom du chemin complet du fichier de log
}
}
Process
{
[pscustomobject]@{ #Génére un objet PowerShell dont chaque ligne représente une colonne du fichier de log
Date = Get-Date -Format "yyyy-MM-dd HH:mm:ss" #Première colonne qui contient la date à laquelle la fonction de log s'est exécuté
Severity = $LogSeverity #Deuxième colonne qui contient la nature du log
File = $LogFile #Troisième colonne qui contient le nom du script PowerShell qui appelle la fonction de log
Line = $LogLine #Quatrième colonne qui contient la ligne à laquelle la fonction de log a été appelée
Message = $LogMessage #Cinquième colonne qui contient le log
} | Export-Csv -Path $LogPath -Append -NoTypeInformation -Delimiter ";" -Encoding UTF8 #Code qui permet de transformer l'objet PowerShell en fichier de log (csv)
}
}
Exemple d'utilisation de la fonction de log
. .\Write-Log_article.ps1 #Permet de déclarer (dot source) la fonction de log pour qu'elle puisse être utilisée
try #Appelle de la fonction de log pour indique l'utilisateur a bien été trouvé
{
$User = Get-ADUser -Identity "maybe" #Cherche un utilisateur dont le samAccountName est maybe
Write-Log -LogSeverity "Information" -LogMessage "L'utilisateur a bien été récupéré" -LogFile $PSCommandPath -LogLine $(Get-CurrentLineNumber)
#$PSCommandPath permet de trouver le chemin complet du script qui est en train de s'exécuter
#Get-CurrentLineNumber fonction déclarée dans le script de log qui permet de récupérer la ligne courante du script qui appelle la fonction de log
}
catch #Appelle la fonction de log si l'utilisateur n'a pas été trouvé et envoie en tant que message de log l'erreur généré par la cmdlet Get-ADUser
{
Write-Log -LogSeverity "Error" -LogMessage $_.Exception.Message -LogFile $PSCommandPath -LogLine $(Get-CurrentLineNumber)
}
Le résultat
Une fois le script PowerShell Call_me_maybe.ps1 appelé, le dossier de log est généré
Le fichier de log est généré
Le log est généré