2017-11-26 5 views
0

appsettings.jsonファイルの値をバインドするApplicationConfigurationSettingsクラスがあります。 LoggerのLogLevelの値を除いて、すべての値を取得できます。おそらく、Loggingエントリのjson形式でサブレベルが存在するためです。appsettingsからPOCO Asp.Net Core 2へのロギング設定のバインド

私はそれが原因であると確信している

services.Configure<ApplicationConfigurationSettings>(Configuration.GetSection("ApplicationConfiguration")); 

appsettings.json(簡潔にするため取り外した部品)

{ 
    "ApplicationConfiguration": { 
     "ConnectionStrings": { 
     "DevelopmentConnection": "Server=(localdb)\\mssqllocaldb;Database=TestingConfigurationNetCoreTwo_Development;Trusted_Connection=True;MultipleActiveResultSets=true"  
     }, 
     "Logging": { 
      "IncludeScopes": false, 
      "LogLevel": { 
       "Default": "Warning" 
     } 
     }, 
     "ApplicationIconUrls": { 
      "MaleUserIcon": "https://machineryrestorations.blob.core.windows.net/publicfiles/images/BestMaleUser_32x32.png", 
      "FemaleUserIcon": "https://machineryrestorations.blob.core.windows.net/publicfiles/images/BestFemaleUser_32x32" 
     }, 
     "ApplicationInfo": { 
      "VersionNumber": "1.0.0", 
      "Author": "Jimbo", 
      "ApplicationName": "CustomTemplate", 
      "CreatedOn": "November 20, 2017" 

     } 
    } 
} 

マイロガーPOCO

public class LoggerSettings 
{ 
    public bool IncludeScopes { get; set; } 
    public KeyValuePair<string,string> LogLevel { get; set; } 
} 

を次のように私はクラスをバインドバインダーがLogLevelプロパティをjsonファイル内のものと一致させることができないという事実に注意してください。 jsonファイルのLogging形式を変更できないため、Logger POCOを変更するにはどうしたらよいですか? {[、偽IncludeScopes:ロギングApplicationConfiguration]} {[ApplicationConfiguration:ロギング:ログレベル:デフォルト、警告]}

これは

services.AddSingleton(Configuration); 

から構成を検査する場合、JSONプロバイダがそれをどのように解決するかであります

クラス内のプロパティを適切に設定して正しくバインドできないようです。

答えて

1

JSONオブジェクト

"LogLevel": { 
    "Default": "Warning" 
} 

は単純な理由public KeyValuePair<string,string> LogLevel { get; set; }プロパティにマップすることができませんでした。

"LogLevel": { 
    "Default": "Warning", 
    "SomeOtherField": "SomeValue" 
} 

はどのようにそれが単一KeyValuePair<string,string>にマッピングする必要があります:どのような後しばらくすると、セクションでは、他の分野で拡張されるのですか?もちろん、あなたの単純なケースでは、そのような単一のKey-Valueオブジェクトが潜在的にマップされる可能性がありますが、コンフィギュレーションバインダーはこれまでのところ想定されていません。

強く型付けされたPOCOからキー値のいくつかの袋に移行しようとしているので、それは良いことだと思っています.netコアで行われている強く型付けされた設定の全体的なアプローチはある程度価値がありません。

問題の修正は非常に簡単です。あなたは少しさらに行くとMicrosoft.Extensions.Logging.LogLevelとしてDefaultプロパティのタイプを設定することができ

public class LoggingLevel 
{ 
    public string Default { get; set; } 
} 

public class LoggerSettings 
{ 
    public bool IncludeScopes { get; set; } 

    public LoggingLevel LogLevel { get; set; } 
} 

:ちょうどstringタイプの単一(この瞬間のための)プロパティDefaultLoggingLevelクラスを宣言。それは、このような単純なPOCOを持ってやり過ぎのように見えることができ、あなたは、高度な設定のためにそれらのかなり多くを持つことになります

public class LoggingLevel 
{ 
    public LogLevel Default { get; set; } 
} 

:コンフィギュレーション・バインダーは、正しく列挙値LogLevel.Warning"Warning"のような文字列値をマッピングします。しかし、実際には、強く型付けされ、明示的で拡張可能な方法です。

+0

tyしかし、私のSerilogの質問に答えた後、私はSerilogの使用に切り替えました。私は入力されたポコを使用しているので、この答えは確かにその点で私を助けます – dinotom

+0

@ CodeFuller ...行を3つに行きたいですか?私は別のSerilog質問をここに掲載しました... https://stackoverflow.com/questions/47540478/serilog-not-getting-application-events-only-coded-logger-events – dinotom

関連する問題