2016-07-14 8 views
1

Diese Fragen beziehen sich darauf, wie eine PowerShell-Ausnahme in Serilog protokolliert wird, sodass sie als Eigenschaft der ersten Klasse und nicht als große Zeichenfolge interpretiert wird.PowerShell-Ausnahmen an Serilog senden

Ich habe ein paar Fragen:

  • Um die vollständige Ausnahme Informationen Ich brauche zu erhalten die Eigenschaften eines Errorrecord
  • Serilog kann eine erweiterte Errorrecord nicht erweitern interpretieren, die in Powershell ein PSCustomObject ist.
  • Aufgrund dieser Probleme muss ich eine Ausnahme als eine große Zeichenfolge senden, die keine gute Praxis ist und eindeutige Nachrichtenvorlagen erstellt.

Es gibt einige gute Informationen darüber, wie eine .NET-Ausnahme in Serilog auf der folgenden Seite anmelden und ich mag etwas ähnliches von Powershell erreichen: http://nblumhardt.com/2014/09/how-not-to-parameterize-serilog-events/

In Powershell Ausnahmen haben zusätzliche Informationen. PowerShell verfügt über Fehlerdatensätze. Um einen Fehlerdatensatz in Powershell anzuzeigen, erstellen Sie zuerst einen Fehler in einer neuen PowerShell-Konsole. Zum Beispiel:

ip[config 

Jetzt sehen Sie sich den Fehler in der Konsole, aber es zeigt Ihnen nicht alle Eigenschaften.

$error[0] 

Wir können sehen, was ein Fehler Record-Objekt ausmacht, und es gibt eine Reihe von Eigenschaften.

$error[0] | Get-Member 

Um dies zu Serilog von Powershell bekommt ich so etwas wie die folgenden tun könnte:

$er = ($error[0] | Select * | Out-String) 

dass das System.Management.Automation.ErrorRecord Objekt erweitern wird, wandeln sie in einen einzigen String ($ äh) so kann ich es dann zu meiner Log-Nachricht hinzufügen.

$Log.Error({Exception}, $er) 

Es ist nicht möglich, das vollständige Fehlerprotokoll zu Serilog zu senden, weil ich zum ersten Mal aller Eigenschaften erweitern habe und das würde als PSCustomObject von Basistyp System.Object enden.

Was wäre hier die beste Praxis? Gibt es einen besseren Weg, als es als String zu übergeben? Kann Serilog ein System.Object übersetzen, das die Eigenschaften von einem ErrorRecord hat?

Gerne stellen wir Ihnen bei Bedarf weitere Codebeispiele zur Verfügung.

Vielen Dank, Blair.

+0

Je nach den Anwendungsfällen genügt es, die im ErrorRecord enthaltene Ausnahme (dh $ Fehler [0] .Exception) zu protokollieren –

+0

Haben Sie versucht, Serlogs Destrukturierungsoperator (@) zu verwenden? So etwas wie: 'Log.Error ($ error [0] .Exception," PowerShell Fehler {@Error} ", $ Fehler [0])' – PatrickSteele

Antwort

2

Vielen Dank Patrick. Dein Beispiel hat für mich funktioniert. Das Problem war, dass ich die System.Exception-Eigenschaft nicht als erste Eigenschaft angegeben habe. Ich wusste nicht, dass ich die Exception und das dekonstruierte ErrorRecord zusammen im selben Event weitergeben könnte.