ログ管理
サーバー側(サーバー側)
ASP.NETボイラープレートは、キャッスルウィンザーのロギング施設ロギングツールを使用し、log4net、nlog、serilogなどのさまざまなログクラスライブラリを使用できます。すべてのログクラスライブラリについて、Castleはそれを実装するための一般的なインターフェイスを提供します。
翻訳者のメモ:キャッスルとは:キャッスルは、データアクセスフレームワークORMからIOCコンテナ、MVCフレームワーク、WebレイヤーのAOPまで、.NETプラットフォームのオープンソースプロジェクトです。基本的には、開発プロセス全体にすべてが含まれます。 ASP.NETボイラープレートのIOCコンテナは、城から実装されています。
log4netは、ASP.NETテンプレートの下で最も人気のあるログライブラリです。 。
ロガーを取得します
選択したログライブラリコンポーネントに関係なく、コードをログインする場合も同じです。 (ここの苦情、CastleのUniversal Iloggerインターフェイスは本当に素晴らしいです)。
トピックにアクセスしましょう:(翻訳者の注:次のコードはcaster.coreソースコード分析とABPフレームワークの実装です)
1.まず、ASP.NETボイラープレートフレームワークを使用して、依存関係の依存噴射テクノロジーを使用し、依存関係噴射を使用してLogger Object Loggerを生成することができます。
次に、ASP.NETボイラープレートがロギング機能をどのように実装するかを見てみましょう。
castle.core.loggingを使用します。 ここでは、最初にiloggerタイプの公共財産ロガーを定義します。これは、ログを記録するために使用するオブジェクトです。 TaskAppServiceオブジェクト(アプリケーションで定義されているタスク)を作成した後、属性インジェクションを通じて実装されます。 public ilogger logger {get;これは、この空のロガーを定義しない場合、依存関係の注入を実装する最良の方法です。オブジェクト参照を取得してインスタンス化すると、例外が生成されます。 //そうなことは、オブジェクトが空でないことを保証します。したがって、言い換えれば、ロガーをセットアップすることなく、ログは記録されず、nullオブジェクトが返されます。 // nullloggerオブジェクトは実際には何もない、空です。これを行うことによってのみ、定義するクラスがインスタンス化されたときに正常に機能することを保証できます。 logger = nulllogger.instance; public void createTask(// 4:loggger.infoを作成する(説明: + input.description); }}コードコピーは次のとおりです。情報2014-07-13 13:40:23,360 [8] simpletasksystem.tasks.taskappservice-説明付きの新しいタスクの作成:寝る前に牛乳を飲むことを忘れないでください!
ログに書き込みた後、次の形式と同じように、ログファイルを表示できます。
ベースクラスを介してロガーを使用しますASP.NETボイラープレートフレームワークは、MVCコントローラー、Web APIコントローラー、アプリケーションサービスクラスのベースクラスを提供します(自分で定義するコントローラーおよびアプリケーションサービスは、ASP.NETボイラープレートのベースクラスを継承する必要があります。 Web APIコントローラー、MVCコントローラー、およびアプリケーションサービスクラスはすべて、ASP.NETボイラープレートフレームワークに対応するベースクラスを継承するため、ロガーを直接使用できます)。
Public Class HomeController:simpletasksystemcontrollerbase {public result index(){a sample log message ...);説明:SimpleTaskSystemControllerBaseこのベースクラスコントローラーは、自分自身を定義するベースクラスコントローラーであり、ABPControllerから継承する必要があります。
このようにして、ロガーは正常に機能します。もちろん、独自のベースクラスを実装することもできます。そのため、依存関係噴射を使用できなくなります。
構成
公式WebサイトでASP.NETボイラープレートテンプレートを介してプロジェクトを生成すると、log4Netのすべての構成が自動的に生成されます。
デフォルトの構成形式は次のとおりです。
•ログレベル:ログ記録レベル、5デバッグ、情報、ワーン、エラー、または致命的。
•日付と時刻:ロギング時間。
•スレッド番号:ログの各行が書かれているときのスレッド番号。
•ロガー名:ロガーの名前、通常はクラス名。
•ログテキスト:書いたログコンテンツ。
構成ファイル:log4net.configは通常、プロジェクトのWebディレクトリにあります。
<?xmlバージョン= 1.0エンコード= utf-8?> <log4net> <appender name = rolingfileappender type = log4net.appender.rollingfileappender> <file value = logs /logs.txt /> < = size /> <maxsizerollbackups value = 10 /> <maximumfilesize value = 10000kb /> <staticlogfilename value = true /> <layout type = log4net.layout.patternlayout> <conversionPattern値=%-5LEVEL%日付[%-5.5THREAD]%-40.40LOGGER-%メッセージ%newline /> < /layout> < /appender> <root> <root> <appender-ref ref = rollingfileappender /> <level value = debug/> </root> <logger name = nhibernate> <level value = warn/> </logger> </log4net>
log4netは、非常に強力で使いやすいログライブラリコンポーネントです。 Nhibernateの上記の構成と同様に、最小ログレベルを設定できます。異なるロガーは、異なるログなどを書き込みます。
特定の使用については、http://logging.apache.org/log4net/release/config-examples.htmlを参照してください
最後に、プロジェクトのglobal.asaxファイルで、log4net構成ファイルを定義します。
パブリッククラスMVCAPPLICATION:ABPWEBAPPLICATION {Protected Override void application_start(object sender、eventargs e){iocmanager.instance.addfacility <loggingfacility>(f => f.uselog4net()。送信者、e);コードの数行は、ログコンポーネントを呼び出します。なぜなら、私たちのフレームワークは、依存関係噴射を通じてロガーを実装しているからです!
クライアント側(クライアント)
最後に、さらに驚くべきことは、クライアント側のロガーを呼び出すこともできることです。クライアント側では、ASP.NETボイラープレートフレームワークには対応するJavaScriptログAPIがあります。これは、ブラウザのログを記録できることを意味し、実装コードは次のとおりです。
abp.log.warn( 'サンプルログメッセージ...');
添付:クライアントJavaScript APIでは、Console.logを使用してクライアントにログを出力できることですが、必ずしもすべてのブラウザーをサポートするわけではなく、スクリプトに例外を引き起こす可能性がありますAPI、私たちのものは安全であり、これらのAPIを過負荷または拡張することもできます。
abp.log.debug( '...'); abp.log.info( '...'); abp.log.warn( '...'); abp.log.error( '...'); ); abp.log.fatal( '...');
設定管理
導入
各アプリケーションは、いくつかの設定を保存し、アプリケーションのどこかに使用する必要があります。 ABPフレームワークは、アプリケーション、テナント、ユーザーレベルの構成を保存/取得するためにサーバーまたはクライアントに設定できる強力なインフラストラクチャを提供します。
設定は通常、データベース(または別のソース)に保存され、名前値文字列に対応する構造で表されます。ストレージのために、非弦の値を文字列値に変換できます。
注:IsettingStoreインターフェイスについて
設定管理を使用するには、IsettingStoreインターフェイスを実装する必要があります。独自の方法で実装でき、参照するモジュールゼロプロジェクトには完全な実装があります。
設定を定義します
使用する前に設定を定義する必要があります。 ABPフレームワークはモジュラー設計であるため、さまざまなモジュールが異なる設定を持つことができます。モジュール自身の設定を定義するには、各モジュールがSettingProviderから継承された派生クラスを作成する必要があります。セットアッププロバイダーの例は次のとおりです。
Public Class MySettingProvider:SettingProvider {Public Override IENUMERABLE <SettingDefinition> getSettingDefinitions(SettingDefinitionProviderContext Context){new SettingDefinition(SMTPSERVERADDRESS、127.0.0.1) settingscopes.tenant) 、新しいSettingDefinition( SiteColorPreference、Red、Scopes:settingscopes.user、isvisibletoclients:true)};getSetTingDefinitionsメソッドは、設定デフィニッションオブジェクトを返します。 SettingDefinitionクラスのコンストラクターには、次のパラメーターがあります。
•名前(必須):システム全体に一意の名前が必要です。より良い方法は、名前を設定するために文字列定数を定義することです。
•デフォルト値:デフォルト値を設定します。この値は、nullまたは空の文字列にすることができます。
•スコープ:設定の範囲を定義します(以下を参照)。
•表示名:後でUIにセット名を表示するためのローカライズ可能な文字列。
•説明:UIの設定の説明を後で表示するためのローカライズ可能な文字列。
•グループ:グループをセットアップするために使用できます。これはUIの使用のみであり、管理を設定するためではありません。
•ISVisibletoClients:Trueに設定すると、設定がクライアントで利用可能になります。
SettingProviderを作成した後、Preintializeメソッドにモジュールを登録する必要があります。
configuration.settings.providers.add <mysettingProvider>();したがって、セットアッププロバイダーは、依存関係(リポジトリなど)を挿入して、セットアップ定義の他のソースを生成できます。
範囲を設定します
settingscopes enumで定義されている3つの設定(またはレベル)があります。
•アプリケーション:アプリケーション全体の設定は、ユーザー/テナントの独立設定に使用されます。たとえば、メールを送信するときにサーバーのIPアドレスを取得するSMTPSERVERADDRESSという設定を定義できます。この設定に単一の値がある場合(ユーザーに基づいて変更されていません)、アプリケーションスコープとして定義できます。
•テナント:アプリケーションがマルチテナントの場合、テナント固有の設定を定義できます。
•ユーザー:ユーザー全体の設定を使用して、各ユーザーの設定値を保存/取得できます。
SettingScopes EnumにはFlagsプロパティがあるため、複数のスコープを使用した設定を定義できます。
設定範囲は階層的です。たとえば、設定範囲をアプリケーション|
•特定のユーザーがユーザーを定義する(書き直す)場合、特定のユーザーの値を取得します。
•そうでない場合は、テナントが定義(書き直す)場合に特定のテナント値を取得します。
•そうでない場合は、アプリケーションを定義する場合、アプリケーションの値を取得します。
•そうでない場合は、デフォルト値を取得します。
デフォルト値は、nullまたは空の文字列にすることができます。可能であれば、設定にデフォルト値を提供することをお勧めします。
設定値を取得します
設定を定義した後、サーバーとクライアントで現在の値を取得できます。
(1)サーバー側
IsettingManagerは、設定を実行するために使用されます。アプリケーションのどこにでも注入して使用できます。 IsettingManagerは、設定された値を取得する多くの方法を定義します。
最も一般的に使用される方法は、getSettingValueです(またはgetSettingValueAsyncは非同期呼び出しです)。デフォルト、アプリケーション、テナント、およびユーザー設定範囲に基づいて現在設定された値を返します(設定前の段落で説明されているように)。例:
//ブール値を取得する(async call)var value1 = await sitedmanager.getSettingValueAsync <Bool>(PassiveUsersCannotLogin); //文字列値を取得する(同期)var value2 = settingmanager.getSettingValue(smtpserveraddress);
GetSettingValueには、上記のように、一般的な非同期バージョンがあります。特定のテナントまたはユーザーの設定のリスト、またはそのすべての設定を取得する方法もあります。
IsettingManagerは広く使用されているため、一部の特定のベースクラス(Applicationservice、Domainservice、ABPControllerなど)には、SettingManagerというプロパティがあります。これらのクラスを継承する場合、明示的に注入する必要はありません。
(2)クライアント
設定を定義するときにisvisibletoclientsがtrueに設定されている場合、クライアントのJavaScriptを使用して現在の値を取得できます。 ABP。名前空間をセットすると、必要な関数とオブジェクトが定義されます。例:
var currentColor = abp.setting.get(sitecolorpreference); ABP.Setting.Valuesオブジェクトを使用して、すべての値を取得できます。サーバー側の設定を変更した場合、ページが何らかの方法で更新またはリロードされたり、コードを介して手動で更新されたりしない限り、クライアントはこの変更について知らないことに注意してください。
設定を変更します
ISETTINGMANAGERは、アプリケーションの変更の変化を定義し、ForturtenantAsyncを変更し、セットセットセットセットセラシンクソート(および同期バージョン)を使用して、アプリケーション、テナント、およびユーザーの設定を個別に変更します。
キャッシュについて
キャッシュはサーバー側の設定管理にあるため、設定値を変更するためにリポジトリまたはデータベースの更新ステートメントを直接使用しないでください。