Question [Astuce] Utiliser des traces ETW dans un workflow

Plus d'informations
il y a 9 ans 2 mois #18803 par Laurent Dardenne
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

Tutoriels PowerShell

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

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