わかりましたので、開発グループへの影響を最小限に抑えて解決したい状況に遭遇しました。
大規模な c# システム (最大 40 の製品アセンブリ) でログ フレームワークとして log4net を使用しています。
現在、サポート側は、ログに記録されたイベントを、個別に維持しているデータベースと関連付けることができるようにしたいと考えています。合理的な要求。
本番環境では、メインのログ リポジトリは Windows イベント ログです。
開発者側では、現在のパターンは次のとおりです。
コンポーネントからログを記録したいときはいつでも、クラスの先頭で次のようにロガーをインスタンス化します。
private static readonly ILogger Log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod())
ロギングコンテキストに何かが必要な場合は、すべてのスレッドのフローでできるだけ早くそれを配置します。サービスコールなどの受信側
ログを記録したいときはいつでも、単純に Log.Warn(str, ex) - (または Info、Error など) を実行します。
ここで、このログ エントリを一意の「eventId」に「修正」したいと考えています。ILogger に拡張メソッドを指定すると、次のことが可能になります。 Log.Warn(int, str, ex), when "int"次のプロパティを持つ数値です。
- 永続ストアに「マッピング」されます。
- 1 つのログ エントリのみを指します。
- ソース コードのログ ステートメントが削除された場合、ID は新しいログ ステートメントに再利用されません。
私の当面の解決策は、可能な「eventId」のセットをカバーし、開発者に「それらを一度だけ使用する」ように指示するグローバルな列挙型を維持することです。
次に、ネームスペースと「CategoryId」の間である種の「インテリジェント」マッピングを実行します。たとえば、「BusinessLayer」ネームスペース内のすべてのものに 1 つの categoryId が割り当てられます。
でも、何か足りない気がする……。
以下についてご意見をお寄せください:
- 大規模なシステムで EventId と CategoryId をどのように使用しますか? (または「何」に使用しますか)
- 開発者がコードステートメントレベルで一意の ID を提供する必要がない、ロギングへの単純なアプローチを維持できるような方法で、EventId を作成する「動的」な方法の例を持っている人はいますか。
私の質問が広すぎる場合は申し訳ありませんが、私はここで少し釣りをしていることを認識しています.