2017-11-26 7 views
1

Serilogロギング機能でパラメータの特定のテンプレートの使用を強制するコントラクトを作成したいと思います。Serilogで特定のパラメータを使用して強制する(または一般的には外部関数で)

私の独自の機能をカプセル化せずにこれを行う方法はありますか(各ログレベルで行う必要があります)?

私はEventLogと呼ばれる名前空間を持っています。この名前空間には、イベントタイプ、施設などがあります。 ロギング時にその名前空間のイベントタイプと機能を使用するように強制したいと思います。

むしろより:

void _LogLevel_<T0, T1, T2>(string messageTemplate, T0 propertyValue0, T1 propertyValue1, T2 propertyValue2);

私はこれを強制したい2つのパラメータが指定されていない場合はコンパイルされないでしょうコードを仮定

void _LogLevel_<EventLog.EventItem, EventLog.Facility, T0, T1>(string messageTemplate, EventLog.EventItem EventType, EventLog.Facility Facility, T0 propertyValue0, T1 propertyValue1, ...);

、そして最初にその2つのオブジェクトは、汎用のT0, T1, ...がSerilogに存在するため、シリアル化されます。

これは、ロギング機能が呼び出されると、指定されたパラメータが常に追加されることを保証するためです。

この問題の別の問題は、Serilogには独自のDSLがあり、文字列であるmessageTemplate{@Event}, {@Facility}を追加することはできません。

答えて

1

メッセージテンプレートでこれを行うのは面倒なようです。あなたはSerilogのForContext()追加の方法とのピギーバッキングにより、後にしているものを達成できます。

あなたは MyLog.ForEvent(e, f).Information("Hello!")のように呼びたい
public static ILogger ForEvent(EventItem item, EventFacility facility) 
{ 
    return Log.ForContext("Event", item, true).ForContext("Facility", facility, true); 
} 

あなたではなく、上記の例で使用される静的Logクラスよりも、​​を使用している場合は、拡張メソッド試してみてください:これは与えられたオブジェクトをシリアライズだろ

public static ILogger ForEvent(this ILogger log, EventItem item, EventFacility facility) 
{ 
    return log.ForContext("Event", item, true).ForContext("Facility", facility, true); 
} 
+0

を? (私はあなたが関数に渡したブール値のパラメータであると仮定しています)。それを強制的にする方法はありますか?ありがとう! –

+0

はい、それが目的です。 –

関連する問題