1

このlog4netのカスタマイズを取得して、PowerShell PSObjectで機能させようとしています。基本的に、このパターン レイアウトはオブジェクトを反復処理し、そのプロパティを CSV 列にダンプします。リフレクションを行うコードは次のとおりです。

PropertyInfo[] properties = loggingEvent.MessageObject.GetType().GetProperties();
            foreach (PropertyInfo prop in properties)
            {
                object value = prop.GetValue(loggingEvent.MessageObject, null);
                loggingEvent.Properties[prop.Name] = value;
            }

これは、C# で通常のクラスを使用する場合にうまく機能します。このように PowerShell でインライン C# を使用してクラスを作成しても機能します。

$code = @”

using System;
namespace CsvTest { 
    public class MyEvent
        {
            public string UserId { get; set; }
            public string Details { get; set; }
            public int EventCode { get; set; }

        }
    }
“@

Add-Type $code

$test = New-Object CsvTest.MyEvent
$test.UserId = "Andy"
$test.Details ="SomeStuff"
$test.EventCode = 10

$MyCommonLogger.Error($test)
$MyCommonLogger.Info($test)
$MyCommonLogger.Warn($test)

うまくいかないのは、カスタム PSObject を作成した場合です。$code を次のような PSCustom オブジェクトに置き換えると、

$obj = New-Object psobject -Property @{
                        "UserId" = "Andy";
                        "EventCode" = 100;
                        "Details" = "DetailInfoGoeshere"
                        }

その後、Null が返されます。これが実際に null を返すことを確認しました。

$obj = New-Object psobject -Property @{
                        "UserId" = "Andy";
                        "EventCode" = 100;
                        "Details" = "DetailInfoGoeshere"
                        }

$obj.GetType().GetProperties()

CSVLogging パターン レイアウトをハックして、着信オブジェクトが PSObject の場合に特別なケースを作成できると思いますが、1 つのタイプのオブジェクトだけにカスタマイズする必要はありません。PowerShell で psobject を取得し、それを GetType().GetProperties() で使用できるものに変換/キャストする方法はありますか?

4

2 に答える 2