web-dev-qa-db-ja.com

「System.String」から「Serilog.Core.IDestructuringPolicy」への無効なキャスト

勉強から Serilog.Sinks.AzureTableStorage 私は以下を持っています

メインで

 var configuration = new ConfigurationBuilder()
            .AddJsonFile("appsettings.json")
            .Build();

        var logger = new LoggerConfiguration()
            .ReadFrom.Configuration(configuration) // the error happens here
            .CreateLogger();

        logger.Information("Hello, world!");

Appsetttings.json(接続文字列が異なる)

"Serilog": {
    "Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.AzureTableStorage" ],

    "MinimumLevel": "Debug",
    "WriteTo": [
      { "Name": "Console" },
      {
        "Name": "File",
        "Args": { "path": "%TEMP%\\Logs\\serilog-configuration-sample.txt" }
      },
      {
        "Name": "AzureTableStorage",
        "Args": {
          "storageTableName": "mystoragetable",
          "connectionString": "myconnectionstring"
                }
      }
    ],
    "Enrich": [ "FromLogContext", "WithMachineName", "WithThreadId" ],
    "Destructure": [
      {
        "Name": "With",
        "Args": { "policy": "Sample.CustomPolicy, Sample" }
      },
      {
        "Name": "ToMaximumDepth",
        "Args": { "maximumDestructuringDepth": 4 }
      },
      {
        "Name": "ToMaximumStringLength",
        "Args": { "maximumStringLength": 100 }
      },
      {
        "Name": "ToMaximumCollectionCount",
        "Args": { "maximumCollectionCount": 10 }
      }
    ],
    "Properties": {
      "Application": "Sample"
    }    
  }

デバッグ出力で、ストレージテーブルにデータが記録されていません。

スローされた例外:System.Private.CoreLib.dllの「System.InvalidCastException」

タイプSystem.InvalidCastExceptionの未処理の例外がSystem.Private.CoreLib.dllで発生しました

「System.String」から「Serilog.Core.IDestructuringPolicy」への無効なキャスト。

[更新]

GitHubのReadMe.Mdのように非常に単純な構成を使用すると、同じエラーが発生します。

[更新]

Kennyzxリンクからコードをコピーしました。エラーはに変わりました

System.InvalidCastException
  HResult=0x80004002
  Message=Invalid cast from 'System.String' to 'Serilog.Core.ILogEventFilter'.
  Source=System.Private.CoreLib

Serilog-settings-configurationサンプルプロジェクトを.netcore2.1にアップグレードしてみることにしました この質問

数時間後、serilog-settings-configurationはdotnetcore 2.1と互換性がないという結論に達しました

9
Kirsten Greed

seSerilog と呼ばれる新しい.NET Core 2.1コンソールプロジェクトをセットアップしようとすると、問題を再現できます。

DestructureセクションとFilterセクションを構成から削除すると、アプリが機能し始めます。

次に、Serilog.Settings.Configurationパッケージのソースコードを確認します this commit を見つけ、このように機能させるにはコードを記述する必要があるという結論に達しました。

以下の構成では、CustomPolicyを実装する "Sample"ネームスペースにIDestructuringPolicyクラスを記述することが期待されています。

{
    "Name": "With",
    "Args": { "policy": "Sample.CustomPolicy, Sample" }
}

これを削除し、Destructureを次のように残すと、機能します。

"Destructure": [
  {
    "Name": "ToMaximumDepth",
    "Args": { "maximumDestructuringDepth": 3 }
  },
  {
    "Name": "ToMaximumStringLength",
    "Args": { "maximumStringLength": 10 }
  },
  {
    "Name": "ToMaximumCollectionCount",
    "Args": { "maximumCollectionCount": 5 }
  }
]

この調査結果がお役に立てば幸いです。

16
kennyzx