Fonction de log PowerShell

Introduction

Comme je fais pas mal de script PowerShell pour mes clients, je réutilise beaucoup de fonctions que j’ai déjà créé auparavant et je pense qu’un jour je ferai une bibliothèque de fonction.

Cependant, je n’ai jamais créé/trouvé de fonction de log me satisfaisant jusqu’à aujourd’hui. Mais cette création ne vient pas de moi, elle vient d’Aaron Guilmette.

J’ai trouvé cette fonction, que j’ai modifiée pour répondre à mes besoins, dans son script « Create Realistic Lab Users » que vous trouverez à cette adresse : ici

Je vous conseille fortement ce script qui vous permet de créer des utilisateurs réalistes pour vos tests Active Directory ou Exchange, donc merci à lui.

 

Création de la fonction de log

Pour commencer, je vais d’abord créer mon paramètre d’entrée du script afin de définir l’emplacement du fichier log.

Param(
[string]$v_LogDir
)

Ensuite, il faut créer la fonction avec les paramètres adéquats. Les paramètres en entrée sont :

  • $v_Message pour transmettre le message
  • $v_LogFile pour transmettre l’emplacement du fichier de log
  • $v_ConsoleOutput pour transmettre la sortie console
  • $v_LogLevel pour transmettre le niveau de log avec une validation des éléments
Function Write-Log([string[]]$v_Message, 
[string]$v_Logfile, 
[switch]$v_ConsoleOutput, 
[ValidateSet("SUCCESS", "INFO", "WARN", "ERROR", "DEBUG")]
[string]$v_LogLevel) {

Du code ...

}

Dans la fonction Write-Log, il y a un If qui permet de redéfinir la variable $v_LogLevel en INFO si elle n’a pas été définie auparavant :

If (!$v_LogLevel) { $v_LogLevel = "INFO" }

Ensuite il y a un Switch qui permet de définir la couleur de sortie en fonction de la variable $v_LogLevel :

switch ($v_LogLevel) { 
SUCCESS { $v_Color = "Green" } 
INFO { $v_Color = "White" } 
WARN { $v_Color = "Yellow" } 
ERROR { $v_Color = "Red" } 
DEBUG { $v_Color = "Gray" } 
}

Il est nécessaire également de tester si le message n’est pas vide grâce à un If :

 if ($v_Message -ne $null -and $v_Message.Length -gt 0) {

Du code ...

}

Dans le If créé auparavant, il est nécessaire d’ajouter la variable $v_TimeStamp qui permet de récupérer la date et l’heure :

$v_TimeStamp = [System.DateTime]::Now.ToString("yyyy-MM-dd HH:mm:ss")

Ensuite, il est nécessaire de créer un nouveau If afin de vérifier si la variable $v_LogFile n’est pas nulle ou vide :

if ($v_Logfile -ne $null -and $v_Logfile -ne [System.String]::Empty) {

Du code ...

}

Puis ajouter dans ce If , la cmdlet de création du fichier de log :

Out-File -Append -FilePath $v_Logfile -InputObject "[$v_TimeStamp] $v_Message"

Enfin, grâce à l’utilisation d’un nouveau If, il est possible de gérer l’afficher sur la console PowerShell :

if ($v_ConsoleOutput -eq $true) {
 Write-Host "[$v_TimeStamp] [$v_LogLevel] :: $v_Message" -ForegroundColor $v_Color 
}

La fonction est prête. Il est ensuite nécessaire de gérer l’emplacement du fichier de log et de tester.

Pour gérer simplement l’emplacement du fichier de log, il est possible d’utiliser le paramètre créé au début du script ou utiliser la cmdlet Get-Location.

If ($v_LogDir -eq "") {[string]$v_LogDir = Get-Location}
$v_LogPathfile = $v_LogDir + "\" + (Get-Date -Format yyyy-MM-dd) + "_TestLogFonction.txt"

 

Script Complet

 

Param(
 [string]$v_LogDir
)

Function Write-Log([string[]]$v_Message, [string]$v_Logfile, 
[switch]$v_ConsoleOutput, 
[ValidateSet("SUCCESS", "INFO", "WARN", "ERROR", "DEBUG")]
[string]$v_LogLevel) {
 
 If (!$v_LogLevel) { $v_LogLevel = "INFO" }

 switch ($v_LogLevel) {
  SUCCESS { $v_Color = "Green" } 
  INFO { $v_Color = "White" } 
  WARN { $v_Color = "Yellow" } 
  ERROR { $v_Color = "Red" } 
  DEBUG { $v_Color = "Gray" } 
 }

 if ($v_Message -ne $null -and $v_Message.Length -gt 0) { 

  $v_TimeStamp = [System.DateTime]::Now.ToString("yyyy-MM-dd HH:mm:ss")

  if ($v_Logfile -ne $null -and $v_Logfile -ne [System.String]::Empty) {
   Out-File -Append -FilePath $v_Logfile -InputObject "[$v_TimeStamp] $v_Message"
  }

  if ($v_ConsoleOutput -eq $true){
   Write-Host "[$v_TimeStamp] [$v_LogLevel] :: $v_Message" -ForegroundColor $v_Color 
  } 
 }
}

If ($v_LogDir -eq "") {[string]$v_LogDir = Get-Location}
$v_LogPathfile = $v_LogDir + "\" + (Get-Date -Format yyyy-MM-dd) + "_TestLogFonction.txt"

 

Test

Il est ensuite aisé d’ajouter ceci aux scripts existants et de faire appel à la fonction avec les paramètres adéquats pour tracer les événements du script.

Par exemple pour écrire un message d’information dans le log :

Write-Log -v_LogFile $v_LogPathfile -v_LogLevel INFO -v_Message "Ceci est un message d'information"

La sortie est la suivante dans le log date_TestLogFonction.log :

[2018-07-24 11:32:39] Ceci est un message d’information

 

Si il n’y a pas de spécification du niveau de log, automatiquement il va le mettre au niveau « INFO » :

Write-Log -v_LogFile $v_LogPathfile -v_Message "Ceci est également un message d'information"

La sortie est la suivante dans le log date_TestLogFonction.log :

[2018-07-24 11:32:39] Ceci est également un message d’information

 

Pour écrire un message d’erreur dans la console et dans le fichier de log :

Write-Log -v_LogFile $v_LogPathfile -v_LogLevel ERROR -v_ConsoleOutput -v_Message "Ceci est un message d'erreur"

La sortie est la suivante dans le log date_TestLogFonction.log :

[2018-07-24 12:08:39] Ceci est un message d’erreur

 

Test de l’ensemble des messages :

Write-Log -v_LogFile $v_LogPathfile -v_LogLevel SUCCESS -v_ConsoleOutput -v_Message "Ceci est un message de succès"
Write-Log -v_LogFile $v_LogPathfile -v_LogLevel INFO -v_ConsoleOutput -v_Message "Ceci est un message d'information"
Write-Log -v_LogFile $v_LogPathfile -v_LogLevel WARN -v_ConsoleOutput -v_Message "Ceci est un message d'avertissement"
Write-Log -v_LogFile $v_LogPathfile -v_LogLevel ERROR -v_ConsoleOutput -v_Message "Ceci est un message d'erreur"
Write-Log -v_LogFile $v_LogPathfile -v_LogLevel DEBUG -v_ConsoleOutput -v_Message "Ceci est un message de debug"

Capture

Votre commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l’aide de votre compte WordPress.com. Déconnexion /  Changer )

Photo Google

Vous commentez à l’aide de votre compte Google. Déconnexion /  Changer )

Image Twitter

Vous commentez à l’aide de votre compte Twitter. Déconnexion /  Changer )

Photo Facebook

Vous commentez à l’aide de votre compte Facebook. Déconnexion /  Changer )

Connexion à %s