PowerShell : générer un log formaté dans vos scripts

Les logs ont une importance capitale pour débugger ou tracer les actions réalisées dans un script. vous trouverez ci-dessous une fonction que j’ai écrite et qui permet de mettre en forme le log : elle réalise l’écriture dans un fichier, une sortie à l’écran ou les deux à la fois. Les sorties à l’écran font ressortir les alertes et les erreurs en couleur.

Function Push-Logging
{
    <#  .SYNOPSIS
            Will ensure a logging activity for any script.
        .DESCRIPTION
            Based on the input parameters, the function will display on screen a progress activity (if requested) and verbosely log in a file. 
        .NOTES
            You can assume a multiple line writting to a log file by using "`n" in the string value of -MESSAGE.
        .PARAMETER Output
            Mandatory : True
            Position  : 1
            Value     : 1 (for screen splash only), 2 (for logfile writing only) or 3 (for screen and log file).
        .PARAMETER Type
            Mandatory : True
            Position  : 2
            Value     : INFO, WARNING or ERROR.
        .PARAMETER Message
            Mandatory : False
            Position  : 3
            Values    : a string containing the message. If nothing, will use a default message.
        .PARAMETER Logfile
            Mandatory : True
            Position  : 4
            Value     : any file name.
        .EXAMPLE
            Using parameter name namely
            ---------------------------
            PS> Push-Logging -Output 3 -Type INFO  -Message "Test message" -Logfile example.log
        .EXAMPLE
            Using parameter position order
            ------------------------------
            PS> Push-Logging 3 INFO "Test message" example.log
        .EXAMPLE
            Using alias instead of full parameter name
            ------------------------------------------
            PS> Push-Logging -o 3 -t INFO -m "test message" -f example.log
    #>
	Param ([Parameter(Mandatory = $true, Position = 1)]
		[alias('o')]
		[ValidateRange(1, 3)]
		[INT]$Output,
		[Parameter(Mandatory = $true, Position = 2)]
		[alias('t')]
		[ValidateSet('INFO', 'WARNING', 'ERROR')]
		[STRING]$Type,
		[Parameter(Mandatory = $false, Position = 3)]
		[alias('m')]
		[STRING]$Message,
		[Parameter(Mandatory = $false, Position = 4)]
		[alias('l')]
		[STRING]$Logfile) #/end of PARAM Block
	#.Defining some default variables 
	$TypeColor = @{ 'INFO' = 'GRAY'; 'WARNING' = 'CYAN'; 'ERROR' = 'RED' }
	$TypeRenam = @{ 'INFO' = '[INF]'; 'WARNING' = '[WRN]'; 'ERROR' = '[ERR]' }
	$oFlagDisp = $false
	$oFlagFile = $false
	
	#.Managing case Output : flagging which logging is to be performed.
	if ($Output -gt 2 -or $Output -eq 1) { $oflagDisp = $true }
	if ($Output -gt 2 -or $Output -eq 2) { $oflagFile = $true }
	
	#.Managing case 1 : display output to screen.
	if ($oFlagDisp)
	{
		#-/ $oFlagDisp is true, will now display on screen the message in the proper format.
		#-/ Generate the display message and splash it over the screen
		if ($Message -match "`n")
		{
			ForEach ($Line in ($Message -split "`n"))
			{
				$MsgDisp = $TypeRenam[$Type] + "`t" + $Line
				Write-Host $MsgDisp -ForegroundColor $TypeColor[$Type]
			} #/ End: ForEach($line...
		} #/ End: If ($MsgDisp -match "*`n*")
		else
		{
			$MsgDisp = $TypeRenam[$Type] + "`t" + $Message
			Write-Host $MsgDisp -ForegroundColor $TypeColor[$Type]
		} #/ end : Else
		
		
	} #/ End: If $oflagDisp
	
	#.Managing case 2 : display verbosely to the log file
	if ($oFlagFile)
	{
		#-/ $oFlagFile is true, will now log content to a log file.
		#-/ Check if a filename is present, else will generate a fixed one.
		if (!(Test-Path .\Logs)) { New-Item Logs -ItemType DIRECTORY > $null }
		if (!$Logfile) { $Logfile = "ERR_NO_LOG_FILE_SPECIFIED_" + (get-date -Format ("yyyy-MM-dd-hh.mm.ss")) + ".log" }
		if ($Message -match "`n")
		{
			ForEach ($Line in ($Message -split "`n"))
			{
				$TimeStamp = (Get-Date -Format G).ToString() + "`t"
				$MsgLogTxt = $TimeStamp + "`t" + $TypeRenam[$type] + "`t" + $Line
				$MsgLogTxt | Out-File $Logfile -Append -Encoding UTF8
			} #/ End: ForEach($line...
		} #/ End: If ($MsgDisp -match "*`n*")
		else
		{
			$TimeStamp = (Get-Date -Format G).ToString() + "`t"
			$MsgLogTxt = $TimeStamp + "`t" + $TypeRenam[$type] + "`t" + $Message
			$MsgLogTxt | Out-File $Logfile -Append -Encoding UTF8
		} #/ end : Else
	} #/ End: If $oflagFile
} #/ End: Function
Petite astuce

Pour que le log contienne des variables, faites calculer le champ -message pour obtenir un resultat de type string. Exemple:

Push-Logging 3 INFO ("Variable toto=" + $toto) $logFile

Lien Permanent pour cet article : https://ms-sec.fr/?p=1198

Laisser un commentaire

Votre adresse ne sera pas publiée.

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.