2016-01-27 10 views
10

私は(ASP.NET 5 RC1に)コンテナにログインするサービスを追加する場合:の分離アプリケーションレベルのロギングおよびフレームワークレベルのログ

services.AddSingleton<ILoggerFactory>(); 
services.AddSingleton(typeof(ILogger<>), typeof(Logger<>)); 
//or just services.AddLogging(); 

は、その後、私は私のアプリ層でロガーを使用することができます。

class MyAppLogicService 
{ 
    public MyAppLogicService(ILogger<MyAppLogicService> logger) 
    { 
     logger.LogInformation("Hey"); 
    } 
} 

しかし、この場合には、私のlogger.LogInformation()イベントは、(リクエストあたり最大10個の開発者によると!)重要でないフレームワーク情報イベントと混合します。

ASP.NET 5 documentation states:

あなたが アプリケーションとそのAPIのレベルではなく、フレームワークのレベルでアプリケーションログを実行することをお勧めします。 フレームワークにはすでにログが組み込まれており、 で適切なログの詳細度を設定するだけで有効にすることができます。

これはどういう意味ですか? ILogger/ILoggerFactoryをクライアントコード(アプリケーションロジック)で使用することはお勧めしませんか?

フレームワークレベルのログからアプリレベルのログを分離するための洗練されたソリューションとは何ですか?今、私はContextSourceによってSerilogとフィルタを使用していますが、これははるかにエレガントからです...

答えて

2

がないフレームワーク 私のレベルでは、アプリケーションとそのAPIのレベルでアプリケーションのロギングを実行するために ここでのメッセージは、フレームワークによって既に記録されているため、すべてのリクエストの詳細をログに記録してはいけないということです。フレームワークのログイベントおよびアプリケーションログイベント混合のよう

- ドキュメントも述べている:

ロガーが作成されると、カテゴリ名が提供されなければなりません。カテゴリ名は、ロギングイベントのソースを指定します。規則により、この文字列は階層的で、カテゴリはドット(。)文字で区切られています。いくつかのロギング・プロバイダーには、この規則を活用したフィルターリング・サポートがあり、目的のロギング出力を簡単に見つけることができます。

注入されたILogger<MyAppLogicService>を使用すると、クラスの完全な名前(名前空間を使用する)がカテゴリ名になっています。

したがって、フレームワーク情報でログが乱雑にならないように、ネームスペースに一致するカテゴリのみを含めることで、すべてのノイズを除外できます。 ConsoleLoggerを使用する場合は、次のようになります。

loggerFactory.AddConsole((cat, level) => cat.StartsWith("mynamespace.")); 

を私は、これは「ContextSourceでSerilogとフィルタリングを使用」に似ていると仮定します。

関連する問題