これは全く問題ありません。通常、ロガーをインスタンス化するのは安価なので、そのようなパフォーマンスのようにするのは大丈夫です。
まだ、(1)Serilogが持つグローバルログインスタンスを使用するか、(2)フィールド宣言で初期化された静的フィールドを使用するかを検討してください。繰り返しますが、パフォーマンスの理由ではなく、関連性の低いものでコンストラクタを汚染しないようにします。 (1)
を実装する上
UPD更新は基本的に、それはあなたがにロガーの初期化コードを置く決定の問題です。 ASP.NETコアでは、(Log
がSerilog
名前空間の静的なクラスであること)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>
と入力しなければなりませんでした。
すぐにお返事ありがとうございます。オプション1の良い参考資料? – vibs
いいですね。私は自分のコードでそれを実装しようとしました。それは動作します! – vibs
2つだけです:1)ログオブジェクトにアクセスするためにビジネスライブラリにserilog nugetパッケージをインストールする必要があります。2)グローバルなので、出力テンプレートフォーマットでsourcecontextを取得しません。クラスnメソッドの詳細をログメッセージに書き込む必要があります。間違っていれば私を正す。 – vibs