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

Your email address will not be published.

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