Question [Astuce] Utiliser des traces ETW dans un workflow
- Laurent Dardenne
- Auteur du sujet
- Hors Ligne
- Modérateur
Réduire
Plus d'informations
- Messages : 6302
- Remerciements reçus 68
il y a 9 ans 11 mois #18803
par Laurent Dardenne
Tutoriels PowerShell
On peut écrire dans les traces native de Powershell à l'aide de la méthode statique GetTraceSource() de la classe [System.Management.Automation.Tracing.PowerShellTraceSourceFactory].
Celle-ci renvoi une instance d'un 'logger' qui permet d'écrire dans le provider 'Microsoft-Windows-PowerShell' :
[code:1]
Logman query providers|? { $_ -match 'powershell'}
# Microsoft-Windows-PowerShell {A0C1853B-5C40-4B15-8766-3CF1C58F985A}
# Microsoft-Windows-PowerShell-DesiredStateConfiguration-FileDownloadManager {AAF67066-0BF8-469F-AB76-275590C434EE}
[/code:1]
Un premier jet :
[code:1]
$CallWF={
Del $pshome\Traces\PSTrace.etl -EA SilentlyContinue
Import-Module PSDiagnostics
Enable-PSWSManCombinedTrace
Test
Disable-PSWSManCombinedTrace
$Global:Result = Get-WinEvent -Path $pshome\Traces\PSTrace.etl -Oldest
$Global:Result|Where-Object {($_.id -eq 45061) -and ($_.Message -match ' \[WF_Test]')}|Fl Message
}
Workflow Test {
InlineScript {
Try {
$Tracer=[System.Management.Automation.Tracing.PowerShellTraceSourceFactory]::GetTraceSource()
[void]$Tracer.WriteMessage(\"[WF_Test] BEGIN Message de Thrace\"«»)
}
Finally {
If ($Tracer -ne $Null)
{ $Tracer.Dispose() }
}
}
$p=Get-process -DisplayName \"Recherche le process Powershell\"
InlineScript {
Try {
$Tracer=[System.Management.Automation.Tracing.PowerShellTraceSourceFactory]::GetTraceSource()
[void]$Tracer.WriteMessage(\"[WF_Test] END Message de Thrace\"«»)
}
Finally {
If ($Tracer -ne $Null)
{ $Tracer.Dispose() }
}
}
}
&$CallWf
# Message : Informations de trace :
# [WF_Test] BEGIN Message de Thrace
#
# Message : Informations de trace :
# [WF_Test] END Message de Thrace
[/code:1]
L'écriture dans le fichier de trace n'est effective qu'à partir du moment où l'on a appelé la cmdlet Enable-PSWSManCombinedTrace.
Une autre approche moins verbeuse qui s'appuie sur une fonction externe au Workflow, celle-ci est automatiquement intégré dans un bloc InlineScript (i.e. une activité) :
[code:1]
Function Trace {
Param([String] $Message)
Try {
$Tracer=[System.Management.Automation.Tracing.PowerShellTraceSourceFactory]::GetTraceSource()
[void]$Tracer.WriteMessage($Message)
}
Finally {
If ($Tracer -ne $Null)
{ $Tracer.Dispose() }
}
}
Workflow Test {
Trace \"[WF_Test] BEGIN Message de Thrace\"
$p=Get-process -DisplayName \"Recherche le process Powershell\"
Trace \"[WF_Test] END Message de Thrace\"
}
&$CallWf
[/code:1]
Une activité encapsulant cet appel serait préférable...<br><br>Message édité par: Laurent Dardenne, à: 21/01/15 11:36
Celle-ci renvoi une instance d'un 'logger' qui permet d'écrire dans le provider 'Microsoft-Windows-PowerShell' :
[code:1]
Logman query providers|? { $_ -match 'powershell'}
# Microsoft-Windows-PowerShell {A0C1853B-5C40-4B15-8766-3CF1C58F985A}
# Microsoft-Windows-PowerShell-DesiredStateConfiguration-FileDownloadManager {AAF67066-0BF8-469F-AB76-275590C434EE}
[/code:1]
Un premier jet :
[code:1]
$CallWF={
Del $pshome\Traces\PSTrace.etl -EA SilentlyContinue
Import-Module PSDiagnostics
Enable-PSWSManCombinedTrace
Test
Disable-PSWSManCombinedTrace
$Global:Result = Get-WinEvent -Path $pshome\Traces\PSTrace.etl -Oldest
$Global:Result|Where-Object {($_.id -eq 45061) -and ($_.Message -match ' \[WF_Test]')}|Fl Message
}
Workflow Test {
InlineScript {
Try {
$Tracer=[System.Management.Automation.Tracing.PowerShellTraceSourceFactory]::GetTraceSource()
[void]$Tracer.WriteMessage(\"[WF_Test] BEGIN Message de Thrace\"«»)
}
Finally {
If ($Tracer -ne $Null)
{ $Tracer.Dispose() }
}
}
$p=Get-process -DisplayName \"Recherche le process Powershell\"
InlineScript {
Try {
$Tracer=[System.Management.Automation.Tracing.PowerShellTraceSourceFactory]::GetTraceSource()
[void]$Tracer.WriteMessage(\"[WF_Test] END Message de Thrace\"«»)
}
Finally {
If ($Tracer -ne $Null)
{ $Tracer.Dispose() }
}
}
}
&$CallWf
# Message : Informations de trace :
# [WF_Test] BEGIN Message de Thrace
#
# Message : Informations de trace :
# [WF_Test] END Message de Thrace
[/code:1]
L'écriture dans le fichier de trace n'est effective qu'à partir du moment où l'on a appelé la cmdlet Enable-PSWSManCombinedTrace.
Une autre approche moins verbeuse qui s'appuie sur une fonction externe au Workflow, celle-ci est automatiquement intégré dans un bloc InlineScript (i.e. une activité) :
[code:1]
Function Trace {
Param([String] $Message)
Try {
$Tracer=[System.Management.Automation.Tracing.PowerShellTraceSourceFactory]::GetTraceSource()
[void]$Tracer.WriteMessage($Message)
}
Finally {
If ($Tracer -ne $Null)
{ $Tracer.Dispose() }
}
}
Workflow Test {
Trace \"[WF_Test] BEGIN Message de Thrace\"
$p=Get-process -DisplayName \"Recherche le process Powershell\"
Trace \"[WF_Test] END Message de Thrace\"
}
&$CallWf
[/code:1]
Une activité encapsulant cet appel serait préférable...<br><br>Message édité par: Laurent Dardenne, à: 21/01/15 11:36
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.093 secondes
- Vous êtes ici :
- Accueil
- forum
- PowerShell
- Contributions à la communauté
- [Astuce] Utiliser des traces ETW dans un workflow