[Outil]Le système de log nommé Log4NET

Plus d'informations
il y a 11 ans 4 mois #3845 par Laurent Dardenne
Concernant le chapitre sur les objets Renderer, on doit soit placer la DLL log4net dans le GAC soit utiliser LoadFrom en lieu et place de LoadFile pour charger l'assembly, sinon on a l'erreur suivante :

$PSRenderer = new-object PSLog4NET.PSObjectRenderer
New-Object : Le type [PSLog4NET.PSObjectRenderer] est introuvable : vérifiez que l'assembly dans lequel il se trouve est chargé.
Au niveau de ligne : 1 Caractère : 26
+ $PSRenderer = new-object <<<< PSLog4NET.PSObjectRenderer

Voir ce post détaillant ce problème.<br><br>Message édité par: Laurent Dardenne, à: 28/01/09 12:39

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 11 ans 4 mois #3863 par Laurent Dardenne
Un aperçus des scripts.
Le minimum :
[code:1]
.\InitializeLG4N.ps1
$Log = Get-LogLogger \&quot;LogPowerShell\&quot;
#Configuration par défaut du framework
Set-LogBasicConfigurator -Default
#Log sur la console
$Log.Info(\&quot;TestMessage1\&quot;«»)
[/code:1]
Et c'est tout !

Celui-ci configure le framework avec une console colorisé et utilise le pipeline
[code:1]
.\InitializeLG4N.ps1
[System.Collections.Hashtable[]] $ConfigColors=@(
@{Level=\&quot;Warn\&quot;;Color=\&quot;Yellow\&quot;},
@{Level=\&quot;Info\&quot;;Color=\&quot;Cyan\&quot;},
@{Level=\&quot;Debug\&quot;;Color=\&quot;Green\&quot;},
@{Level=\&quot;Error\&quot;;Color=\&quot;Red\&quot;}
)

$Header=\&quot;Pied de page\&quot;
New-LogColoredConsoleAppender $ConfigColors|`
Add-LogLayout -L \&quot;%date{dd-MM-yyyy } %-5level - %message%newline\&quot; -F \&quot;En-tête de page\&quot; -H $Header|`
Set-LogBasicConfigurator

$Log = Get-LogLogger \&quot;LogPowerShell\&quot;
$Log.Info(\&quot;TestMessage2\&quot;«»);
[/code:1]
Les fonctions existantes :
[code:1]
#Raccourcis
LogManager
LogBasicCnfg
LogXmlCnfg
LogColoredConsole
LogColors
LogLevel
LogThreadCtx
LogGlobalCtx
LogShorcuts

#Functions
isAssemblyLoaded
Add-LogAppender
Add-LogDenyAllFilter
Add-LogLayout
Add-LogLevelColors
Add-LogRangeFilter
Add-LogStringFilter
Get-LogAppender
Get-LogDebugging
Get-LogGlobalProperty
Get-LogLogger
Get-LogLoggers
Get-LogRepositories
Get-LogRepository
Get-LogRootLogger
New-EventLogAppender
New-LogAppender
New-LogColoredConsoleAppender
New-LogConsoleAppender
New-LogDebugAppender
New-LogFileAppender
New-LogLayout
Pop-LogThreadContext
Push-LogThreadContext
Set-LogActiveProperty
Set-LogAppenderThreshold
Set-LogBasicConfigurator
Set-LogDebugging
Set-LogGlobalProperty
Set-LogHierarchyThreshold
Set-LogLoggerLevel
Set-LogXMLConfigurator
Stop-Log
Update-LogLayout
[/code:1]
Un script de tests :
[code:1]

$Assertions.Clear()
$msg=\&quot;le paramètre Class doit être renseigné\&quot;
$SB={ New-LogAppender }
AssertThrows System.Management.Automation.RuntimeException $msg $sb \&quot;New-LogAppender paramètre Class manquant\&quot;

$msg=\&quot;la classe n'est pas une classe dérivée\&quot;
$SB={New-LogAppender string}
AssertThrows System.Management.Automation.RuntimeException $msg $sb \&quot;New-LogAppender paramètre Class incorrect\&quot;

$msg=\&quot;le paramètre Class est à null.\&quot;
$SB={New-LogAppender $null}
AssertThrows System.Management.Automation.RuntimeException $msg $sb \&quot;New-LogAppender paramètre Class est à Null\&quot;

$msg=\&quot;le paramètre LogPattern contient une chaîne vide.\&quot;
$SB={New-LogAppender log4net.Appender.ConsoleAppender }
AssertThrows System.Management.Automation.RuntimeException $msg $sb \&quot;New-LogAppender paramètre Class est à Null\&quot;

#Pour le paramètre Layout de type string, la conversion fonctionne pour toute valeur
# New-LogAppender log4net.Appender.ConsoleAppender string ou 10 ou \&quot;\&quot;

$Pattern = \&quot;%date{dd-MM-yyyy } [%thread] %-5level [%x] - %message%newline\&quot;
$A=New-LogAppender log4net.Appender.ConsoleAppender $Pattern
Assert ($A.GetType().Fullname -eq \&quot;log4net.Appender.ConsoleAppender\&quot; -and
$A.Layout.ConversionPattern -eq $Pattern ) -label \&quot;Création AppenderConsole par New-LogConsoleAppender\&quot;
RaiseAssertions
Pause
[/code:1]
Mais il reste encore à faire avant de les finaliser :huh:

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 11 ans 4 mois #3874 par Laurent Dardenne
Un nouvel exemple :
[code:1]
#Demo4.ps1
.\InitializeLG4N.ps1

function TestLevel{
Write-host \&quot;Level $($Log.Logger.Level)\&quot; -for green
$Log.Debug(\&quot;Level Debug.\&quot;«»)
$Log.Info(\&quot;Level Info.\&quot;«»)
$Log.Warn(\&quot;Level Warn.\&quot;«»)
$Log.Error(\&quot;Level Error.\&quot;«»)
$Log.Fatal(\&quot;Level Fatal.\&quot;«»)
}

$FileName=\&quot;C:\Temp\LogDemo4.txt\&quot;
#$FileName=\&quot;?:\Temp\LogDemo4.txt\&quot; #Test sur 1 cdrom ou un drive en R/O

$Header=\&quot;Pied de page\&quot;
$Appender=New-LogFileAppender $FileName -n \&quot;FichierDeLog\&quot;|`
#Les champs Footer et Header sont gérés par ce type d'appender
Add-LogLayout -L \&quot;%date %-5level - %message%newline\&quot; -F \&quot;En-tête de page\&quot; -H $Header|`
Set-LogBasicConfigurator

$Log = Get-LogLogger \&quot;LogPowerShell\&quot;
Testlevel
gc \&quot;c:\temp\LogDemo4.txt\&quot;


#On n'utilise pas l'objet renvoyé par le pipeline
#Void ne renvoi pas l'appender rémit par Log???Filter
#Dans ce cas les traces de Write-Debug ne sont plus affichées
$Appender|`
Update-LogLayout -L \&quot;%date{dd-MM-yyyy } %-5level - %message%newline\&quot;|`
Add-LogRangeFilter -Min Warn -Max Critical|`
Add-LogStringFilter -MatchStr \&quot;Test\&quot;|`
Add-LogDenyAllFilter
Testlevel
gc \&quot;c:\temp\LogDemo4.txt\&quot;
$Appender.ActivateOptions() #Note : Sur un FileAppender existant cet appel efface le fichier


#Affiche le liste des filtres.
#Pour le dernier (DenyAllFilter) une ligne vide est affichée car il ne contient aucune propriété.
$Appender|Get-LogFilters
$Appender|% {Write-host \&quot;L'appender $($_.Name) contient $(($_|Get-LogFilters).Count) Filtres\&quot;}



$DebugPreference=\&quot;continue\&quot;
# Supprime le premier filtre répondant au critére renvoyé par un scriptblock
# $CurrentFilter est une variable interne à la fonction Remove-LogFilters et
# elle référence le filtre courant lors du parcourt de la liste chainée.
$Appender|Remove-LogFilters -S { $CurrentFilter -is [log4net.Filter.LevelRangeFilter]}
$Appender|Get-LogFilters
$Appender|% {Write-host \&quot;L'appender $($_.Name) contient $(($_|Get-LogFilters).Count) Filtres\&quot;}


#Arrête le Framework et ferme proprement le fichier de log
Stop-Log
del \&quot;C:\Temp\LogDemo4.txt\&quot;

[/code:1]
Trois nouvelles fonctions :
[code:1]
Get-LogFilters
New-LogFilter
Remove-LogFilters
[/code:1]
L'usage d'un fichier de configuration XML
[code:1]
#Demo5.ps1
.\InitializeLG4N.ps1
#Charge une configuration XML
Set-LogXMLConfigurator \&quot;$Pwd\PSLogColor.App.Config\&quot;
$Log = [log4net.LogManager]::GetLogger(\&quot;LogPowerShell\&quot;«»)
TestLevel
[/code:1]
C'est plus rapide à écrire :P

Et enfin le mode Watch :
[code:1] #Charge une configuration XML en mode surveillance.
Set-LogXMLConfigurator \&quot;$Pwd\PSLogColor.App.Config\&quot; -Watch
#On modifie le contenu du fichier surveillé
[xml] $xml=get-content \&quot;$PWD\PSLogColor.App.Config\&quot;
...[/code:1]<br><br>Message édité par: Laurent Dardenne, à: 1/02/09 17:14

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 11 ans 4 mois #3898 par Laurent Dardenne
Un dernier exemple avant la finalisation du wrapper :
[code:1]
#Demo7.ps1
.\InitializeLG4N.ps1

#Définition des couleurs d'affichage
[System.Collections.Hashtable[]] $ConfigColors=@(
@{Level=\&quot;Warn\&quot;;FColor=\&quot;Yellow\&quot;;BColor=\&quot;\&quot;},
@{Level=\&quot;Info\&quot;;FColor=\&quot;Cyan\&quot;;BColor=\&quot;\&quot;},
@{Level=\&quot;Debug\&quot;;FColor=\&quot;Green\&quot;;BColor=\&quot;\&quot;},
@{Level=\&quot;Error\&quot;;FColor=\&quot;Red\&quot;;BColor=\&quot;\&quot;}
)

# !!!!!!!!!! on utilise le repository par défaut !!!!!!!!!!!!

$MonLogger = Get-LogLogger \&quot;LogPowerShell\&quot;
#Crée un appender console colorisé
$Appender=New-LogColoredConsoleAppender $ConfigColors|`
Add-LogLayout -L \&quot;%date %-5level - %message%newline\&quot; |`
Add-LogRangeFilter -Min Warn -Max Critical|`
Add-LogStringFilter -MatchStr \&quot;Test\&quot;|`
Add-LogDenyAllFilter|`
Enable-LogAppender


$Logger2=Get-LogLogger \&quot;Logger2\&quot;|Add-LogLoggerAppender $Appender
#Ou sans variable intermédiaire
$Logger2=Get-LogLogger \&quot;Logger2\&quot;|`
Add-LogLoggerAppender (
New-LogColoredConsoleAppender $ConfigColors|`
Add-LogLayout -L \&quot;%date %-5level - %message%newline\&quot; |`
Add-LogRangeFilter -Min Warn -Max Critical|`
Add-LogStringFilter -MatchStr \&quot;Test\&quot;|`
Add-LogDenyAllFilter|`
Enable-LogAppender|`
#Modifie le seuil de l'appender
Foreach { $_.Threshold = Test-LogLevel Info }
)|`
#Modifie le niveau du logger
Foreach {$_.logger.Level= Test-LogLevel $LevelName}




# !!!!!!!!!! On utilise un repository particulier dans lequel !!!!!!!!!!!!
# !!!!!!!!!! le logger a été créé !!!!!!!!!!!!

#Dans ce cas le logger doit être créé avant de créer l'appender
$Logger2=Get-LogLogger \&quot;RepositoryName\&quot; \&quot;Logger2\&quot;
$NewAppender=$Logger2|`
Add-LogLoggerAppender (
New-LogColoredConsoleAppender $ConfigColors|`
Add-LogLayout -L \&quot;%date %-5level - %message%newline\&quot; |`
Add-LogRangeFilter -Min Warn -Max Critical -R $Logger2.Repository|`
Add-LogStringFilter -MatchStr \&quot;Test\&quot;|`
Add-LogDenyAllFilter|`
Enable-LogAppender|`
#Modifie le seuil de l'appender
Foreach { $_.Threshold = Test-LogLevel Info -R $Logger2.Repository }
)

#Modifie le niveau du logger
$Logger2.logger.Level= Test-LogLevel $LevelName $Logger2.Repository
[/code:1]
Le Enable-LogAppender est nécessaire puisque qu'après la création d'un appender dans le pipeline on ne connait pas le nombre de segment susceptible de le modifier. Il appel la méthode ActivateOptions, sans cela l'appender est considéré comme invalide.

J'ai préféré ajouter le préfixe LOG dans la partie nom du nom de fonction, l'usage d'alias facilitera la saisie, par exemple :
[code:1]Alias -name Add-Appender -value Add-LogLoggerAppender [/code:1]
Ainsi en cas de duplication de nom, la modification de l'alias n'implique pas de modifier le source du wrapper.
[code:1]
$Logger2=Get-Logger \&quot;RepositoryName\&quot; \&quot;Logger2\&quot;
$NewAppender=$Logger2|`
Add-Appender (
New-ColoredAppender $ConfigColors|`
Add-Layout -L \&quot;%date %-5level - %message%newline\&quot; |`
Add-RangeFilter -Min Warn -Max Critical -R $Logger2.Repository|`
Add-StringFilter -MatchStr \&quot;Test\&quot;|`
Add-DenyAllFilter|`
Enable-Appender|`
#Modifie le seuil de l'appender
Foreach { $_.Threshold = Test-LogLevel Info -R $Logger2.Repository }
)
[/code:1]
Voilà, voilà :)

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 11 ans 3 mois #3970 par Laurent Dardenne
Voici le fichier contenant le wrapper, la DLL n'y est pas recopiée (consultez les précédent posts).
C'est une version 0.1, je n'ai pas encore testé les cas d'erreurs les plus courant.

Installation :
Décompressez le fichier, puis recopier la DLL dans le répertoire Log4Posh.
Ensuite exécutez le script ..\Log4Posh\InitializeLG4N.ps1.
Vous pouvez aussi installer la DLL log4NEt dans le GAC, la signature de la DLL est celle utilisée par le projet disponible sur SourceForge.

Je n'ai encore vérifié la fonction de création d'un RollingFileAppender ni celle de suppression des objets utilisés par ce Wrapper (Remove-WrapperLog4Net).

La prochaine étape : la localisation des scripts et des fonctions.

Si vous avez des remarques n'hésitez pas.

La pièce jointe Log4Posh.zip est absente ou indisponible



[edit]
J'ai joint une dizaine de démo qui reprennent les points abordés dans le tutoriel, mais en utilisant cett fois les fonction du Wrapper.<br><br>Message édité par: Laurent Dardenne, à: 8/02/09 18:47

Tutoriels PowerShell
Pièces jointes :

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 11 ans 3 mois #4054 par Laurent Dardenne
Une démo autour de l'appender RollingFileAppender.

Il s'agit d'un mécanisme séquencé, cyclique ou non, de nommage de fichier.
Cela permet d'avoir par exemple un fichier de log par jour.
[code:1]
#Demo10.ps1

function TestLevel{
Write-host \&quot;Level $($Log.Logger.Level)\&quot; -for green
$Log.Debug(\&quot;Level Debug.\&quot;«»)
$Log.Info(\&quot;Level Info.\&quot;«»)
$Log.Warn(\&quot;Level Warn.\&quot;«»)
$Log.Error(\&quot;Level Error.\&quot;«»)
$Log.Fatal(\&quot;Level Fatal.\&quot;«»)
}

$FileName=\&quot;C:\Temp\LogDemo11.txt\&quot;
#Prise en compte du format de date court de la culture courante
$DatePattern=(Get-UICulture).DateTimeFormat.ShortDatePattern -Replace \&quot;/\&quot;,\&quot;-\&quot;

$Appender=New-RollingFileAppender $FileName -Name \&quot;FichierDeLog\&quot;`
-MaximumFileSize \&quot;1KB\&quot; -MaxSizeRollBackups 2 `
-DatePattern $DatePattern `
-AppendToFile|`
Add-LogLayout -L \&quot;%date %-5level - %message%newline\&quot;|`
Enable-LogAppender|`
Set-LogBasicConfigurator

if ($Appender.Writer -eq $null)
#Si on ne dispose pas de droit d'écriture ou si le drive est en R/O
# un message d'erreur est affiché sur la console. Le script continue mais la propriété Writer est à $null.
{Write-Warning \&quot;L'appender $Name n'est peut être pas correctement configuré pour le fichier $Filename\&quot;}


$Log = Get-LogLogger \&quot;LogPowerShell\&quot;
1..3|% {Testlevel}
dir \&quot;C:\Temp\LogDemo11*\&quot;
type \&quot;C:\Temp\LogDemo11*\&quot;

#On force la prise en compte de la date dans le nom du fichier
Set-Date -Date (Get-Date).AddDays(1)
1..3|% {Testlevel}
Set-Date -Date (Get-Date).AddDays(-1)
dir \&quot;C:\Temp\LogDemo11*\&quot;
type \&quot;C:\Temp\LogDemo11*\&quot;
Stop-Log
[/code:1]
On peut donc avoir pour cet exemple les fichiers suivants:
[code:1] #1 ere exécution le 12/02/09
C:\Temp\LogDemo11.txt
C:\Temp\LogDemo11.txt.1
C:\Temp\LogDemo11.txt.2
#Le jour suivant
C:\Temp\LogDemo11.txt13-02-2009
C:\Temp\LogDemo11.txt13-02-2009.1
C:\Temp\LogDemo11.txt13-02-2009.2
etc.[/code:1]
Je suis en train d'adapter l'appender SMTP qui permet d'envoyer un mail. Un usage pourrait être d'envoyer un mail aux administrateurs si l'exécution d'un script génére une ou des erreurs fatales.
Un mode push en quelque sorte.

Pour des administrateurs itinérant, par exemple, ce système pourrait être très utile, et en plus l'outil est gratuit ;)<br><br>Message édité par: Laurent Dardenne, à: 15/02/09 14:36

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.279 secondes
Propulsé par Kunena