2016-07-14 9 views
1

Эти вопросы касаются того, как регистрировать исключение PowerShell в Serilog, чтобы оно интерпретировалось как свойство класса fist, а не большая строка.Отправка исключений PowerShell для Serilog

У меня есть несколько вопросов:

  • Чтобы получить полную информацию об исключении мне нужно расширить свойства ErrorRecord
  • Serilog не может интерпретировать расширенную ErrorRecord, который в PowerShell является PSCustomObject.
  • Из-за этих проблем я должен отправить исключение в виде большой строки, которая не является хорошей практикой и создает уникальные шаблоны сообщений.

Есть некоторые хорошие детали о том, как войти исключение .NET в Serilog на следующей странице, и я хотел бы, чтобы достичь чего-то подобного с помощью PowerShell: http://nblumhardt.com/2014/09/how-not-to-parameterize-serilog-events/

В исключениях PowerShell есть дополнительная информация. У PowerShell есть записи ошибок. Чтобы просмотреть запись об ошибке в Powershell, сначала создайте ошибку в новой консоли PowerShell. Например:

ip[config 

Теперь взгляните на ошибку в консоли, но она не покажет вам все свойства.

$error[0] 

Мы можем видеть, что составляет объект записи об ошибке, и существует ряд свойств.

$error[0] | Get-Member 

Чтобы получить эту Serilog из PowerShell я мог бы сделать что-то вроде следующего:

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

Это расширит объект System.Management.Automation.ErrorRecord, преобразовать его в одну строку ($ er), поэтому я могу добавить его в свое сообщение журнала.

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

Это не представляется возможным отправить полную запись об ошибке Serilog потому что я должен расширить все свойства первого и которые в конечном итоге в качестве PSCustomObject из базового типа System.Object.

Что было бы лучше всего здесь? Есть ли лучший способ, чем передать его в виде строки? Может ли Serilog перевести объект System.Object, который обладает свойствами из ErrorRecord?

Благодарим за предоставление дополнительных примеров кода, если требуется.

Большое спасибо, Блэр.

+0

В зависимости от вариантов использования может быть достаточно просто зарегистрировать Исключение, содержащееся в ErrorRecord (например, '$ Error [0] .Exception'). –

+0

Пробовали ли вы использовать серрологический деструктурирующий оператор (@)? Что-то вроде: 'Log.Error ($ error [0] .Exception," Ошибка Powershell {@Error} ", $ error [0])' – PatrickSteele

ответ

2

Спасибо, Патрик. Ваш пример работал на меня. Проблема заключалась в том, что я не помещал свойство System.Exception в качестве первого свойства. Я не понимал, что могу пройти исключение и деконструированный ErrorRecord вместе в одном и том же случае.