Flash info

Maître Yoda utilise PowerShell. Cette source encore non confirmée par Obi-Wan Kenobi aurait pour origine une conférence sur la force obscure de CMD. Que le POWERshell soit avec vous...

 
Accueil arrow Forum

Bienvenue sur le forum PowerShell-Scripting.com

 
Laurent Dardenne
Utilisateur

PowerShelleur Platinum
Messages: 5251
graph
Karma: 192  
[Outil]Le système de log nommé Log4NET - 21/01/09 14:09 Projet Log4Posh.

Pour ceux et celles qui souhaitent utiliser un système de log évolué, vous pouvez consulter ce tutoriel d'introduction à Log4net.
Un des intérêts de ce Framework est de logger avec une seule instruction vers plusieurs sources (Console,fichier,eventlog,...)
Je suis en train de terminer la rédaction d'un tutoriel sur le sujet pour utilisation sous PowerShell.

En attendant un exemple simple utilisant une destination de type "console colorisé ":
Code:

  cd VotreChemin $Log4NetHome=$PWD  # Charge la librairie log4net [void][Reflection.Assembly]::LoadFile"$Log4NetHome\log4net.dll")    #Initialise le Framework log4net [log4net.LogManager]::ResetConfiguration()    #Crée un appender de type console colorisée permettant de loguer dans la console  #Un appender est une destination, un dispositif sur lequel on écrit/envoie un résultat  $ColoredConsoleAppender = new-object log4net.Appender.ColoredConsoleAppender $ColoredConsoleAppender.Name="LogColoredConsole"    # Association niveau de log-couleur d'affichage $ConfigColors=@(  @{Level="Warn";Color="Yellow"},  @{Level="Info";Color="Cyan"},  @{Level="Debug";Color="Green"},  @{Level="Error";Color="Red"} )  #Configure le mappage des couleurs pour les niveaux de log  # C'est une factorisation de code $ConfigColors|% {    $Colors = new-object log4net.Appender.ColoredConsoleAppender+LevelColors   $Colors.ForeColor=[log4net.Appender.ColoredConsoleAppender+Colors]::$($_.Color)   $Colors.Level=[log4net.Core.Level]::$($_.Level)   $ColoredConsoleAppender.AddMapping($Colors)  }  #Chaîne de formatage utilisant des tags prédéfinis dans Log4NET   $logpattern2 "%date{dd-MM-yyyy } %-5level - %message%newline"  #Ajoute un layout utilisé pour formater le texte du message de log  #Un layout est une indication de mise en page d'une chaîne de caractères $ColoredConsoleAppender.Layout=new-object log4net.Layout.PatternLayout($logpattern2) $ColoredConsoleAppender.ActivateOptions()  #On configure le Framework [log4net.Config.BasicConfigurator]::Configure($ColoredConsoleAppender)  #Un logger est l'objet de base du système de log, c'est à l'aide d'un logger qu'on écrit un message $LogMain = [log4net.LogManager]::GetLogger("Main") $LogMain.Info("Recherche des fichiers."$Files=gci c:\*.toto If ($Files -eq $null)    {$LogMain.Warn("Aucun fichier") } else   { $LogMain.Debug("{0} fichiers" -F $Files.Count) } $Sb={  Trap {$LogMain.Error("Except",$error[0].Exception);continue}  $i=0  1/$i  } &$Sb  #Ici on utilise un scriptblock, dans l'appel $LogMain.Info(   (&{     If ($Files -eq $null)      {"Aucun fichier"}     else {"{0} fichiers" -F $Files.Count}    }) #Les parenthèses sont nécessaires pour l'appel du scriptblock, la méthode Info attend une string  #$LogMain.Info  # Le niveau de log est-il Debug ? if ($LogMain.IsDebugEnabled)   {     $DbgAppender = new-object log4net.Appender.OutputDebugStringAppender    $logpatternDbg="%-4timestamp [%thread] Logger:%logger - %message%newline"      $DbgAppender.Layout=new-object log4net.Layout.PatternLayout($logpatternDbg)      #level = Debug    $DbgAppender.Threshold = [log4net.Core.Level]::Debug    $DbgAppender.ActivateOptions()     #Ajoute un appender au logger      # Le log est émit sur 2 destinations : la console et le debugger     # Si le debugger n'est pas activé l'instruction suivante ne provoquera pas d'erreur      $LogMain.Logger.AddAppender($DbgAppender)    &"C:\dev\DebugView\Dbgview.exe"     sleep 3    $LogMain.Debug("Message via log4NET")    }


Notez qu'avec ce système les logs sont ordonnés, on peut ainsi afficher tout ou partie des logs insérés dans des scripts :
Code:

  function TestLevel{  # régle : DEBUG < INFO < WARN < ERROR < FATAL  Write-host "Level $($LogMain.Logger.Level)" -for green  $LogMain.Debug("Level Debug.")  $LogMain.Info("Level Info.")  $LogMain.Warn("Level Warn.")  $LogMain.Error("Level Error.")  $LogMain.Fatal("Level Fatal.") } $LogMain.Logger.Level=[log4net.Core.Level]::Warn #Les messages Debug et Info ne sont plus affichés TestLevel #Seul les messages Fatal seront affichés $LogMain.Logger.Level=[log4net.Core.Level]::Fatal TestLevel $LogMain.Logger.Level=[log4net.Core.Level]::Error TestLevel  #Plus aucun message n'est affiché $LogMain.Logger.Level=[log4net.Core.Level]::Off TestLevel  #Tous les messages sont affichés $LogMain.Logger.Level=[log4net.Core.Level]::All TestLevel    #Pour arrêter proprement le Framework de Log  # Shutdown #[log4net.LogManager]::Shutdown()



A suivre : ajout d'un appender Fichier

Message édité par: Laurent Dardenne, à: 24/02/09 12:02
Tutoriels PowerShell
  | | L'administrateur a désactivé l'accés public en écriture.
janel
Admin

Administrateur
Messages: 576
graphgraph
Karma: 31  
Re:[Outil]Le système de log nommé Log4NET - 21/01/09 15:48 Ca a l'air intéressant cet assembly. Il ne reste plus qu'à créer un module pour faciliter son installation et permettre son utilisation via quelques fonctions un peu plus conviviales, et ce sera parfait !

Janel
  | | L'administrateur a désactivé l'accés public en écriture.
Laurent Dardenne
Utilisateur

PowerShelleur Platinum
Messages: 5251
graph
Karma: 192  
Re:[Outil]Le système de log nommé Log4NET - 21/01/09 16:07 janel écrit:
Ca a l'air intéressant cet assembly.

Oui vraiment.
janel écrit:

permettre son utilisation via quelques fonctions un peu plus conviviales

J'étudie la question mais je manque un peu de recul pour faire des choix pertinents.
Il faut le pratiquer qq temps avant d'en comprendre toutes les fonctionnalités, enfin celles possibles sous PowerShell.
Le tutoriel fait une trentaine de pages et aborde les principaux objets de ce framework.

Message édité par: Laurent Dardenne, à: 21/01/09 16:07
Tutoriels PowerShell
  | | L'administrateur a désactivé l'accés public en écriture.
janel
Admin

Administrateur
Messages: 576
graphgraph
Karma: 31  
Re:[Outil]Le système de log nommé Log4NET - 21/01/09 18:40 J'attends avec impatience le tutoriel pour pouvoir regarder ça de plus près !

De mon côté je me suis promis de tester la création et l'utilisation de modules dans les prochains jours. Je ferai un compte-rendu sur ce forum.

Janel
  | | L'administrateur a désactivé l'accés public en écriture.
Laurent Dardenne
Utilisateur

PowerShelleur Platinum
Messages: 5251
graph
Karma: 192  
Re:[Outil]Le système de log nommé Log4NET - 22/01/09 13:24 Je joins la dll, ça peut servir
Voyons comment ajouter un FileAppender afin d'écrire dans un fichier :
Code:

   #Crée un appender fichier  #Les logs sont dirigés dans un fichier texte $File = new-object log4net.Appender.FileAppender  $File.Name="FichierDeLog" $File.File="$Pwd\PS-Log1.txt" $logpattern "%date %-5level - %message%newline" $File.Layout=new-object log4net.Layout.PatternLayout($logpattern)  #On ajoute dans le fichier s'il existe $File.AppendToFile=$True $File.ActivateOptions() $LogMain.Logger.AddAppender($File) gc $File.File $LogMain.Debug("Ajout d'un appender fichier") gc $File.File  #Le fichier est verrouillé tant que l'appender $File est actif  #Mais il existe un mode de verrouillage moins restrictif. 


Ainsi pour chaque log nous avons 3 destinations : la console, le debugger s'il est actif et le fichier.
Pour visualiser le résultat vous pouvez utiliser le soft Bartail, cité dans le tuto indiqué précédemment, ou celui-ci basé sur ASP.NET : http://demo.l4ndash.com/
File Attachment:
File name: log4net.zip
File size:98242 bytes


Message édité par: Laurent Dardenne, à: 22/01/09 13:25
Tutoriels PowerShell
  | | L'administrateur a désactivé l'accés public en écriture.
Laurent Dardenne
Utilisateur

PowerShelleur Platinum
Messages: 5251
graph
Karma: 192  
Re:[Outil]Le système de log nommé Log4NET - 27/01/09 20:18 Je vous joins le tutoriel, il me reste à finaliser les scripts encapsulant certaines méthodes de log4net.
Bonne lecture.

ps
Vous pouvez télécharger la documentation au format CHM ici : http://heywood.id.au/pub/log4net-help.chm
File Attachment:
File name: Tutoriel_PS_Log4net.zip
File size:250298 bytes


Message édité par: Laurent Dardenne, à: 27/01/09 20:19
Tutoriels PowerShell
  | | L'administrateur a désactivé l'accés public en écriture.
Laurent Dardenne
Utilisateur

PowerShelleur Platinum
Messages: 5251
graph
Karma: 192  
Re:[Outil]Le système de log nommé Log4NET - 28/01/09 12:38 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.

Message édité par: Laurent Dardenne, à: 28/01/09 12:39
Tutoriels PowerShell
  | | L'administrateur a désactivé l'accés public en écriture.
Laurent Dardenne
Utilisateur

PowerShelleur Platinum
Messages: 5251
graph
Karma: 192  
Re:[Outil]Le système de log nommé Log4NET - 29/01/09 20:02 Un aperçus des scripts.
Le minimum :
Code:

  .\InitializeLG4N.ps1  $Log Get-LogLogger "LogPowerShell"  #Configuration par défaut du framework  Set-LogBasicConfigurator -Default  #Log sur la console $Log.Info("TestMessage1")


Et c'est tout !

Celui-ci configure le framework avec une console colorisé et utilise le pipeline
Code:

  .\InitializeLG4N.ps1  [System.Collections.Hashtable[]] $ConfigColors=@(      @{Level="Warn";Color="Yellow"},      @{Level="Info";Color="Cyan"},      @{Level="Debug";Color="Green"},      @{Level="Error";Color="Red"}     )     $Header="Pied de page" New-LogColoredConsoleAppender $ConfigColors|`  Add-LogLayout -L "%date{dd-MM-yyyy } %-5level - %message%newline" -F "En-tête de page" -H $Header|`  Set-LogBasicConfigurator   $Log Get-LogLogger "LogPowerShell"  $Log.Info("TestMessage2");


Les fonctions existantes :
Code:

   #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


Un script de tests :
Code:

  $Assertions.Clear() $msg="le paramètre Class doit être renseigné" $SB={ New-LogAppender } AssertThrows System.Management.Automation.RuntimeException $msg $sb "New-LogAppender paramètre Class manquant" $msg="la classe n'est pas une classe dérivée" $SB={New-LogAppender string} AssertThrows System.Management.Automation.RuntimeException $msg $sb "New-LogAppender paramètre Class incorrect" $msg="le paramètre Class est à null." $SB={New-LogAppender $null} AssertThrows System.Management.Automation.RuntimeException $msg $sb "New-LogAppender paramètre Class est à Null" $msg="le paramètre LogPattern contient une chaîne vide." $SB={New-LogAppender log4net.Appender.ConsoleAppender } AssertThrows System.Management.Automation.RuntimeException $msg $sb "New-LogAppender paramètre Class est à Null" #Pour le paramètre Layout de type string, la conversion fonctionne pour toute valeur # New-LogAppender log4net.Appender.ConsoleAppender string ou 10 ou ""  $Pattern "%date{dd-MM-yyyy } [%thread] %-5level [%x] - %message%newline" $A=New-LogAppender log4net.Appender.ConsoleAppender $Pattern  Assert ($A.GetType().Fullname -eq "log4net.Appender.ConsoleAppender" -and         $A.Layout.ConversionPattern -eq $Pattern ) -label "Création AppenderConsole par New-LogConsoleAppender" RaiseAssertions Pause


Mais il reste encore à faire avant de les finaliser
Tutoriels PowerShell
  | | L'administrateur a désactivé l'accés public en écriture.
Laurent Dardenne
Utilisateur

PowerShelleur Platinum
Messages: 5251
graph
Karma: 192  
Re:[Outil]Le système de log nommé Log4NET - 1/02/09 17:07 Un nouvel exemple :
Code:

  #Demo4.ps1 .\InitializeLG4N.ps1  function TestLevel{  Write-host "Level $($Log.Logger.Level)" -for green  $Log.Debug("Level Debug.")  $Log.Info("Level Info.")  $Log.Warn("Level Warn.")  $Log.Error("Level Error.")  $Log.Fatal("Level Fatal.") } $FileName="C:\Temp\LogDemo4.txt" #$FileName="?:\Temp\LogDemo4.txt" #Test sur 1 cdrom ou un drive en R/O $Header="Pied de page" $Appender=New-LogFileAppender $FileName -"FichierDeLog"|`    #Les champs Footer et Header sont gérés par ce type d'appender  Add-LogLayout -L "%date %-5level - %message%newline" -F "En-tête de page" -H $Header|`  Set-LogBasicConfigurator   $Log Get-LogLogger "LogPowerShell"  Testlevel gc "c:\temp\LogDemo4.txt"    #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 "%date{dd-MM-yyyy } %-5level - %message%newline"|`  Add-LogRangeFilter -Min Warn -Max Critical|`  Add-LogStringFilter -MatchStr "Test"|`  Add-LogDenyAllFilter Testlevel  gc "c:\temp\LogDemo4.txt" $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 "L'appender $($_.Name) contient $(($_|Get-LogFilters).Count) Filtres"} $DebugPreference="continue"  # 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 -$CurrentFilter -is [log4net.Filter.LevelRangeFilter]} $Appender|Get-LogFilters $Appender|% {Write-host "L'appender $($_.Name) contient $(($_|Get-LogFilters).Count) Filtres"}  #Arrête le Framework et ferme proprement le fichier de log Stop-Log del "C:\Temp\LogDemo4.txt"


Trois nouvelles fonctions :
Code:

  Get-LogFilters    New-LogFilter     Remove-LogFilters


L'usage d'un fichier de configuration XML
Code:

  #Demo5.ps1 .\InitializeLG4N.ps1   #Charge une configuration XML Set-LogXMLConfigurator "$Pwd\PSLogColor.App.Config" $Log = [log4net.LogManager]::GetLogger("LogPowerShell") TestLevel


C'est plus rapide à écrire

Et enfin le mode Watch :
Code:

  #Charge une configuration XML en mode surveillance. Set-LogXMLConfigurator "$Pwd\PSLogColor.App.Config" -Watch  #On modifie le contenu du fichier surveillé [xml$xml=get-content "$PWD\PSLogColor.App.Config" ...



Message édité par: Laurent Dardenne, à: 1/02/09 17:14
Tutoriels PowerShell
  | | L'administrateur a désactivé l'accés public en écriture.
Laurent Dardenne
Utilisateur

PowerShelleur Platinum
Messages: 5251
graph
Karma: 192  
Re:[Outil]Le système de log nommé Log4NET - 3/02/09 12:57 Un dernier exemple avant la finalisation du wrapper :
Code:

  #Demo7.ps1 .\InitializeLG4N.ps1   #Définition des couleurs d'affichage [System.Collections.Hashtable[]] $ConfigColors=@(    @{Level="Warn";FColor="Yellow";BColor=""},    @{Level="Info";FColor="Cyan";BColor=""},    @{Level="Debug";FColor="Green";BColor=""},    @{Level="Error";FColor="Red";BColor=""}  )  #  !!!!!!!!!! on utilise le repository par défaut !!!!!!!!!!!! $MonLogger Get-LogLogger "LogPowerShell"   #Crée un appender console colorisé $Appender=New-LogColoredConsoleAppender $ConfigColors|`            Add-LogLayout -L "%date %-5level - %message%newline" |`            Add-LogRangeFilter -Min Warn -Max Critical|`            Add-LogStringFilter -MatchStr "Test"|`            Add-LogDenyAllFilter|`            Enable-LogAppender             $Logger2=Get-LogLogger "Logger2"|Add-LogLoggerAppender $Appender  #Ou sans variable intermédiaire $Logger2=Get-LogLogger "Logger2"|`   Add-LogLoggerAppender (     New-LogColoredConsoleAppender $ConfigColors|`            Add-LogLayout -L "%date %-5level - %message%newline" |`            Add-LogRangeFilter -Min Warn -Max Critical|`            Add-LogStringFilter -MatchStr "Test"|`            Add-LogDenyAllFilter|`            Enable-LogAppender|`             #Modifie le seuil de l'appender            Foreach { $_.Threshold Test-LogLevel Info }    )|`   #Modifie le niveau du logger    Foreach {$_.logger.LevelTest-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 "RepositoryName" "Logger2" $NewAppender=$Logger2|`               Add-LogLoggerAppender (                 New-LogColoredConsoleAppender $ConfigColors|`                        Add-LogLayout -L "%date %-5level - %message%newline" |`                        Add-LogRangeFilter -Min Warn -Max Critical -R $Logger2.Repository|`                        Add-LogStringFilter -MatchStr "Test"|`                        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.LevelTest-LogLevel $LevelName $Logger2.Repository


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:

 Alias -name Add-Appender -value Add-LogLoggerAppender 


Ainsi en cas de duplication de nom, la modification de l'alias n'implique pas de modifier le source du wrapper.
Code:

  $Logger2=Get-Logger "RepositoryName" "Logger2" $NewAppender=$Logger2|`               Add-Appender (                 New-ColoredAppender $ConfigColors|`                        Add-Layout -"%date %-5level - %message%newline" |`                        Add-RangeFilter -Min Warn -Max Critical -R $Logger2.Repository|`                        Add-StringFilter -MatchStr "Test"|`                        Add-DenyAllFilter|`                        Enable-Appender|`                         #Modifie le seuil de l'appender                        Foreach { $_.Threshold = Test-LogLevel Info -R $Logger2.Repository }                 )


Voilà, voilà
Tutoriels PowerShell
  | | L'administrateur a désactivé l'accés public en écriture.
Laurent Dardenne
Utilisateur

PowerShelleur Platinum
Messages: 5251
graph
Karma: 192  
Re:[Outil]Le système de log nommé Log4NET - 8/02/09 18:45 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 ..Log4PoshInitializeLG4N.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.
File Attachment:
File name: Log4Posh.zip
File size:36476 bytes


[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.

Message édité par: Laurent Dardenne, à: 8/02/09 18:47
Tutoriels PowerShell
  | | L'administrateur a désactivé l'accés public en écriture.
Laurent Dardenne
Utilisateur

PowerShelleur Platinum
Messages: 5251
graph
Karma: 192  
Re:[Outil]Le système de log nommé Log4NET - 14/02/09 17:15 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:

  #Demo10.ps1 function TestLevel{  Write-host "Level $($Log.Logger.Level)" -for green  $Log.Debug("Level Debug.")  $Log.Info("Level Info.")  $Log.Warn("Level Warn.")  $Log.Error("Level Error.")  $Log.Fatal("Level Fatal.") } $FileName="C:\Temp\LogDemo11.txt"  #Prise en compte du format de date court de la culture courante $DatePattern=(Get-UICulture).DateTimeFormat.ShortDatePattern -Replace "/","-" $Appender=New-RollingFileAppender $FileName -Name "FichierDeLog"`                                   -MaximumFileSize "1KB" -MaxSizeRollBackups 2 `                                   -DatePattern $DatePattern `                                   -AppendToFile|`  Add-LogLayout -"%date %-5level - %message%newline"|`  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 "L'appender $Name n'est peut être pas correctement configuré pour le fichier $Filename"}   $Log Get-LogLogger "LogPowerShell"  1..3|% {Testlevel} dir "C:\Temp\LogDemo11*" type "C:\Temp\LogDemo11*"  #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 "C:\Temp\LogDemo11*" type "C:\Temp\LogDemo11*" Stop-Log


On peut donc avoir pour cet exemple les fichiers suivants:
Code:

  #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.


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

Message édité par: Laurent Dardenne, à: 15/02/09 14:36
Tutoriels PowerShell
  | | L'administrateur a désactivé l'accés public en écriture.
Laurent Dardenne
Utilisateur

PowerShelleur Platinum
Messages: 5251
graph
Karma: 192  
Re:[Outil]Le système de log nommé Log4NET - 15/02/09 14:49 Une démo sur l'appender SMTP :
Code:

   #!!!!!!!  Change the email addresses !!!!!!!!!!!!! $From="Log4Posh@Gmail.fr" $To="Administrators@Gmail.US" #or $To="Administrators@Gmail.US,user2.@Yahoo.us" $SMTPHost="smtp.google.com"  #Configuration à minima  New-LogSmtpAppender -"%date %-5level - %message%newline" `                     -Name "Mailer" `                     -Evaluator (New-LogLevelEvaluator "Fatal") `                     -From $From `                     -To $To `                     -SMTPHost $SMTPHost `                     -Subject "[$env:COMPUTERNAME]Fatal Error in $($MyInvocation.InvocationName) script."|`     Enable-LogAppender|`     Set-LogBasicConfigurator $LogMail  Get-LogLogger "SendMail"  #Send 1 message, Now $LogMail.Fatal("Fatal error detected.")    #Title : [MyServername]Fatal Error in Demo11.ps1 script. #body : 2009-02-15 10:09:03,515 FATAL - Fatal error detected.   #Déclare une propriété active globale . .\PackageDebugTools.ps1  Set-LogActiveProperty "CallStack" { $(ParseStack $(Get-CallStack)) }  $DatePattern=(Get-UICulture).DateTimeFormat.ShortDatePattern -Replace "/","-"  $LogPattern "[%P{log4net:HostName}(Logger=%logger)]-%date{$DatePattern} %-5level %property{CallStack} - % message%newline"  Update-LogLayout $LogMail.Logger.Parent.Appenders[0$LogPattern $Subject"[$env:COMPUTERNAME]Fatal Error in function `$(`$MyInvocation.InvocationName)." Function Une { Deux } Function Deux {  $LogMail.Logger.Parent.Appenders[0].Subject$ExecutionContext.InvokeCommand.ExpandString($Subject)   $LogMail.Fatal("Dans la fonction Deux") #Title : [MyServername]Fatal Error in function Deux. #body : [MyServername(Logger=SendMail)]-15-02-2009 FATAL une:Deux - Dans la fonction Deux  } Une


Ensuite, en utilisant un objet Renderer adapté, on peut envoyer un compte rendu de l'erreur :
Code:

  $LogMail.Logger.Parent.Appenders[0].Subject="[$env:COMPUTERNAME]Fatal Error in $($MyInvocation.InvocationName) script." $RndrPath=$Pwd  # charge la librairie PSLog4NET (Renderer) [Reflection.Assembly]::LoadFrom("$RndrPath\PSLog4NET.dll") $PSRenderer = new-object PSLog4NET.PSObjectRenderer $Repository = [log4net.LogManager]::GetRepository() $Repository.RendererMap.Put([PSLog4NET.PSObjectRenderer],(new-object PSLog4NET.PSObjectRenderer) ) #. .\PackageDebugTools.ps1 $PSRenderer|Add-Member -Force -MemberType ScriptMethod ToString rver|Out-String }  #Déclenche une erreur .\Demo11-1Error.ps1


Le script déclenchant l'erreur :
Code:

  #Demo11-1Error.ps1 #Génére une erreur    #Envoi un compte rendu détaillé d'une erreur PowerShell    trap {$LogMail.Fatal($PSRenderer)}    $Error.clear()    $i=0    1/$i


Le résultat dans le mail reçu :
Code:

  [PCTest(Logger=SendMail)]-15-02-2009 FATAL .\Demo11-1Error.ps1 Exception             System.Management.Automation.RuntimeExceptionTentative de division par zéro. ---> System.Divi                         deByZeroExceptionTentative de division par zéro.                            à System.Management.Automation.ParserOps.polyDiv...                 ... TargetObject          CategoryInfo          NonSpécifié : (:) [], RuntimeException FullyQualifiedErrorId RuntimeException ErrorDetails          InvocationInfo        System.Management.Automation.InvocationInfo MyCommand        ScriptLineNumber 7 OffsetInLine     6 ScriptName       G:\Temp\Packages\Demo\Demo11-1Error.ps1 Line             :    1/$i PositionMessage  :                     Au niveau de G:\Temp\Packages\Demo\Demo11-1Error.ps1 7 Caractère 6                    +    1/$ <<<< i InvocationName   : / PipelineLength   0 PipelinePosition 0 ...


On connait donc la machine émettrice, le script fautif et la ligne en erreur. Cool

Pas mal pour du scripting

Message édité par: Laurent Dardenne, à: 16/02/09 18:35
Tutoriels PowerShell
  | | L'administrateur a désactivé l'accés public en écriture.
Laurent Dardenne
Utilisateur

PowerShelleur Platinum
Messages: 5251
graph
Karma: 192  
Re:[Outil]Le système de log nommé Log4NET - 24/02/09 12:04 Les scripts seront mis à jour sur Codeplex Log4Posh.
Bon logs.
Tutoriels PowerShell
  | | L'administrateur a désactivé l'accés public en écriture.
Laurent Dardenne
Utilisateur

PowerShelleur Platinum
Messages: 5251
graph
Karma: 192  
Re:[Outil]Le système de log nommé Log4NET - 9/03/09 18:46 Correction d'un bug dans le fonction New-LogStringFilter :
Code:

 function global:New-LogStringFilter([log4net.Appender.AppenderSkeleton$Appender,                                     [String$Regex,                                      [String$MatchStr,                                     [Switch] $Inverse){  #Filtre sur une chaîne ou une expression régulière ou les deux.   begin   {     function NewStringFilter([log4net.Appender.AppenderSkeleton$Appender=$(Throw $LogDatas.Get("NecessaryParameter","New-LogStringFilter","Appender")),                              [String$Regex,                               [String$MatchStr,                              [Switch] $Inverse){        $SbProperties={          $Filter.RegexToMatch =$RegEx          $Filter.StringToMatch=$MatchStr           #Inverse la condition du test du filtre          if ($Inverse) {$Filter.AcceptOnMatch=$False }        }        Write-Debug "$($SbProperties)"        $Filter=New-LogFilter log4net.Filter.StringMatchFilter $SbProperties        $Filter     }   }   process   {      if ($_)      {            Write-Debug ("Process : {0}" -F $MyInvocation.InvocationName)         NewStringFilter -Appender $_ -Reg $Regex -MatchStr $MatchStr -Inverse:$Inverse         #On émet un filtre      }   }   end   {      if ($Appender)       {          Write-Debug ("End : {0}" -F $MyInvocation.InvocationName)         NewStringFilter -Appender $Appender -Reg $Regex -MatchStr $MatchStr -Inverse:$Inverse        }   } }


Ah le copier-coller !

Message édité par: Laurent Dardenne, à: 9/03/09 18:47
Tutoriels PowerShell
  | | L'administrateur a désactivé l'accés public en écriture.
Laurent Dardenne
Utilisateur

PowerShelleur Platinum
Messages: 5251
graph
Karma: 192  
Re:[Outil]Le système de log nommé Log4NET - 21/11/13 11:09 Un version simplifiée basée sur un fichier de configuration XML. Voir le projet de démo.
File Attachment:
File name: Log4Posh-6be8f5a7d2ea63707eb11071445d2bff.zip
File size:222573 bytes

[edit]
Une refonte du module:
http://psionic.codeplex.com/wikipage?title=Log4PoshModule-FR&referringTitle=French-version

Message édité par: Laurent Dardenne, à: 26/05/14 20:11
Tutoriels PowerShell
  | | L'administrateur a désactivé l'accés public en écriture.
Laurent Dardenne
Utilisateur

PowerShelleur Platinum
Messages: 5251
graph
Karma: 192  
Re:[Outil]Le système de log nommé Log4NET - 24/09/16 18:51 Une nouvelle version 2.0 Tutoriels PowerShell
  | | L'administrateur a désactivé l'accés public en écriture.
Laurent Dardenne
Utilisateur

PowerShelleur Platinum
Messages: 5251
graph
Karma: 192  
Re:[Outil]Le système de log nommé Log4NET - 10/03/17 18:04 Une nouvelle version 2.1.

Support de .NET Core 1.0 / .NET Standard 1.3

Pas encore testé sous NanoServer ni sous Linux et autre.
Tutoriels PowerShell
  | | L'administrateur a désactivé l'accés public en écriture.
Laurent Dardenne
Utilisateur

PowerShelleur Platinum
Messages: 5251
graph
Karma: 192  
Re:[Outil]Le système de log nommé Log4NET - 29/08/17 00:17 Nouvelle version 2.2.0
Quelques corrections de bug mineurs

Les fonctions Initialize-Log4NetModule et Initialize-Log4NetScript son obsolète.
Utilisez désormais la fonction Initialize-Log4Net.

Ajout de 2 démos d'usage du module au sein d'un script.
Tutoriels PowerShell
  | | L'administrateur a désactivé l'accés public en écriture.
© 2017 PowerShell-Scripting.com