超シンプルなJavascriptロギング-2つのデコレータ、および完了


logger.info('ServiceName.methodName.')およびlogger.info('ServiceName.methodName -> done.')を書くのにまだ飽きていますか? たぶん、あなたは、私のように、このビジネスを自動化することを繰り返し考えましたか? この記事では、2つのデコレーターだけで問題を解決するためのオプションの1つとして、 クラスロガーについて説明します。


なぜ必要なのでしょうか?


すべての完璧主義者がエンジニアではありませんが、すべてのエンジニアは完璧主義者です(まあ、ほぼ)。 美しい簡潔な抽象が好きです。 私たちはワニのセットの美しさを見て、人は準備ができておらず、読むことができません。 私たちは神のように感じ、私たちのルールに従って生きるミクロの宇宙を作りたいと思っています。 おそらく、これらすべての資質は私たちの計り知れない怠に起因しています。 いいえ、エンジニアはクラスとして働くことを恐れていませんが、彼の腕が自動化のために到達する日常的な反復アクションを激しく嫌っています。


ロギングのみを目的とした数千行のコードを記述した後、通常、メッセージを記述するための独自のパターンと標準を作成します。 残念ながら、これらのパターンを手動で適用する必要があります。 クラスロガーの主な「理由」は、クラスを作成してそのメソッドを呼び出すときに、テンプレートメッセージを簡単に記録する宣言的で構成可能な方法を提供することです。


チェッカーがむき出しになっています!


さまようことなく、コードに直行しましょう。


 import { LogClass, Log } from 'class-logger' @LogClass() class ServiceCats { @Log() eat(food: string) { return 'purr' } } 

このサービスは3つのログエントリを作成します。



コードの言葉で:


 //    ServiceCats // `ServiceCats.construct. Args: [].` const serviceCats = new ServiceCats() //    `eat` // `ServiceCats.eat. Args: [milk].` serviceCats.eat('milk') //    `eat` // `ServiceCats.eat -> done. Args: [milk]. Res: purr.` 

ライブ突く


誓約できるイベントの完全なリスト:



機能プロパティは、プロパティに割り当てられた矢印関数です( class ServiceCats { private meow = () => null } )。 実行コンテキストを維持するために最もよく使用されます( this )。

「設定可能な」ロギング方法が約束されました


クラスロガーの構成階層の3つのレベル:



各メソッドを呼び出すと、3つのレベルすべてがマージされます。 このライブラリは、妥当なグローバルなデフォルト設定を提供するため、事前の設定なしで使用できます。


グローバル設定


アプリケーション全体に対して作成されます。 setConfigでオーバーライドできます。


 import { setConfig } from 'class-logger' setConfig({ log: console.info, }) 

クラス構成


クラスごとに一意であり、このクラスのすべてのメソッドに適用されます。 グローバル設定を上書きする場合があります。


 import { LogClass } from 'class-logger' setConfig({ log: console.info, }) @LogClass({ //       log: console.debug, }) class ServiceCats {} 

メソッド構成


メソッド自体に対してのみ機能します。 クラス構成およびグローバル構成よりも優先されます。


 import { LogClass } from 'class-logger' setConfig({ log: console.info, }) @LogClass({ //       log: console.debug, }) class ServiceCats { private energy = 100 @Log({ //        log: console.warn, }) eat(food: string) { return 'purr' } //    `console.debug`    sleep() { this.energy += 100 } } 

突くライブ


何を設定できますか?


構成を変更する方法を検討しましたが、変更内容を正確に把握することはまだできていません。


ここでは、さまざまなケースの構成オブジェクトの多くの例を見つけることができます

TypeScriptをよく理解している場合は、インターフェイスにリンクしてください。 ロシア人より:)

構成オブジェクトには次のプロパティがあります。


ログ


これは、実際にロギングを処理する関数です。 入力時に文字列として書式設定されたメッセージを受け取ります。 次のイベントを記録するために使用されます。



デフォルトでは、 console.log


logError


これはロギングも処理する機能ですが、エラーメッセージのみです。 彼女はまた、フォーマットされたメッセージを文字列として受け取ります。 次のイベントを記録するために使用されます。



デフォルトはconsole.errorです。


フォーマッター


これは、 startend 2つのメソッドを持つオブジェクトです。 これらのメソッドは、同じフォーマットのメッセージを作成します。


startは、次のイベントのメッセージを作成します。



endは、次のイベントのメッセージを生成します。



デフォルトでは、 new ClassLoggerFormatterService()


含む


最終メッセージに含めるべきものの構成。


args

ブール値またはオブジェクトのいずれかです。


boolean場合、すべてのメッセージ( startおよびend )に引数のリストを含めるかどうかを設定します( Args: [milk] ?を思い出してください)。


オブジェクトの場合、2つのブール型プロパティstartおよびendです。 startは、 startメッセージに引数リストを含め、 endメッセージにendを含めるかどうかを指定します。


デフォルトはtrueです。


構築する

これは、クラスの作成を記録するかどうかを制御するbooleanです。


デフォルトはtrueです。


結果

これは、メソッドからの戻り値のロギングを制御するboolean値です。 戻り値は、実行が成功したときにメソッドが返すものであるだけでなく、実行が失敗した場合にスローするエラーでもあることに注意してください。 Res: purr覚えていますか? このフラグがfalse場合、 Res: purrはありません。


デフォルトはtrueです。


classInstance

ブール値またはオブジェクトのいずれかです。 概念はinclude.argsと同じです。


クラスのシリアル化されたインスタンスビューを投稿に追加します。 つまり、クラスにプロパティがある場合、JSONでシリアル化されてログに追加されます。


すべてのプロパティがシリアル化できるわけではありません。 クラスロガーは次のロジックを使用します:



 class ServiceA {} @LogClass({ include: { classInstance: true, }, }) class Test { private serviceA = new ServiceA() private prop1 = 42 private prop2 = { test: 42 } private method1 = () => null @Log() public method2() { return 42 } } //    `Test` // 'Test.construct. Args: []. Class instance: {"prop1":42,"prop2":{"test":42}}.' const test = new Test() //    `method2` // 'Test.method2. Args: []. Class instance: {"prop1":42,"prop2":{"test":42}}.' test.method2() //    `method2` // 'Test.method2 -> done. Args: []. Class instance: {"prop1":42,"prop2":{"test":42}}. Res: 42.' 

デフォルトはfalseです。


メッセージのフォーマットを完全に制御する


アイデアが好きなのに、美しいというアイデアが別のメッセージ行形式を主張している場合はどうでしょうか? 独自のフォーマッターを渡すことで、メッセージのフォーマットを完全に制御できます。


独自のフォーマッタを最初から作成できます。 もちろん。 ただし、このオプションはこのフレームワークではカバーされません(この特定のオプションに興味がある場合は、READMEの「フォーマット」セクションを参照してください)。


書式設定をオーバーライドする最も速く簡単な方法は、デフォルトのフォーマッタであるClassLoggerFormatterServiceからフォーマッタを継承することです。


ClassLoggerFormatterServiceは、最終メッセージの小さなブロックを作成する次のprotectedメソッドがあります。



startメッセージは次のもので構成されます。



endメッセージは次のもので構成されます。



必要な基本メソッドのみをオーバーライドできます。


すべての投稿にタイムスタンプを追加する方法を見てみましょう。


これは実際のプロジェクトで行うべきだと言っているのではありません。 pinowinston、および他のほとんどのロガーは、自分でこれを行うことができます。 この例は、教育目的のみです。

 import { ClassLoggerFormatterService, IClassLoggerFormatterStartData, setConfig, } from 'class-logger' class ClassLoggerTimestampFormatterService extends ClassLoggerFormatterService { protected base(data: IClassLoggerFormatterStartData) { const baseSuper = super.base(data) const timestamp = Date.now() const baseWithTimestamp = `${timestamp}:${baseSuper}` return baseWithTimestamp } } setConfig({ formatter: new ClassLoggerTimestampFormatterService(), }) 

突くライブ


おわりに


プロジェクトでこのライブラリを使用する前に、インストール手順に従って要件を必ずお読みください。


あなたが時間を無駄にしないことを願っています。そして、この記事は少なくともあなたにとって有用でした。 蹴って批判してください。 一緒にコードを改善する方法を学びます。



Source: https://habr.com/ru/post/J447970/


All Articles