2017-08-08 14 views
1

私は現在、ASP.NETコアLoggerFactorySerilog拡張子)を使用してロギングを処理しています。コントローラとビジネスサービスのメソッドにログを入れたい。私はその​​のコンストラクタ・インジェクションを介してコントローラにASP.NETコア - 複数のインスタンスのロガー

次のように行っている:

サービスで
ILogger<HomeController> _logger 

ILogger<ServiceName> _logger 

私は、各HTTP要求のように、これは、各要求でインスタンス化されると信じてLoggerという複数のインスタンスが作成されます。各コントローラと各サービスクラスについて言えば、以前のロギング方法とは少し異なります。ここでは、1つのロガーインスタンスを作成し、あらゆる場所でロギングに使用しました。

これには何らかの欠点がありますか?

答えて

2

これは全く問題ありません。通常、ロガーをインスタンス化するのは安価なので、そのようなパフォーマンスのようにするのは大丈夫です。

まだ、(1)Serilogが持つグローバルログインスタンスを使用するか、(2)フィールド宣言で初期化された静的フィールドを使用するかを検討してください。繰り返しますが、パフォーマンスの理由ではなく、関連性の低いものでコンストラクタを汚染しないようにします。 (1)

を実装する上

UPD更新は基本的に、それはあなたがにロガーの初期化コードを置く決定の問題です。 ASP.NETコアでは、(LogSerilog名前空間の静的なクラスであること)Mainメソッドの最初の行のようになります。

Log.Logger = new LoggerConfiguration().WriteTo.LiterateConsole(LogEventLevel.Debug, LogTemplate) 
               .WriteTo.File(@"C:\logs\elbakogdabot.log", LogEventLevel.Debug, LogTemplate) 
               .Enrich.FromLogContext() 
               .CreateLogger(); 

(単に明確にする:私は私の実際のプロジェクトからコードを取りましたロガーの実際の設定は異なる場合があります)。

その後、私はどこにもこのような、それを使用します。

Log.Warning($"got a message for an unknown user: userid=[{userId}]"); 

この行は、任意のクラスの中にスローされる可能性があり、あなたはそのクラスの余分な初期化を行う必要はありません。 (2)

を実装する上

UPD更新私は、一般的な企業のアプリで、常にメッセージにあなたが何かをログに記録するたびに、クラス名を入れて覚えたのは問題だろうと思います。だから私はほとんどの時間static readonlyフィールドに行くだろう。 Serilogを使用すると、そのようにそれを行うことができます。

public class XYZService 
{ 
    private static readonly Serilog.ILogger log = Log.ForContext<XYZService>(); 
... 

この方法で、あなたの両方は、コンストラクタを汚染せず、自動的にログメッセージのすべてのクラス名を取得します。私はReSharperスニペットでこの行を使用していたので、新しいクラスにはすべてlg<TAB>と入力しなければなりませんでした。

+0

すぐにお返事ありがとうございます。オプション1の良い参考資料? – vibs

+0

いいですね。私は自分のコードでそれを実装しようとしました。それは動作します! – vibs

+0

2つだけです:1)ログオブジェクトにアクセスするためにビジネスライブラリにserilog nugetパッケージをインストールする必要があります。2)グローバルなので、出力テンプレートフォーマットでsourcecontextを取得しません。クラスnメソッドの詳細をログメッセージに書き込む必要があります。間違っていれば私を正す。 – vibs

関連する問題