hexlogには、haxeで書かれたlog4jに触発されたロギングシステムが含まれています
Hexmachina.orgのHexmachinaの詳細については、詳細をご覧ください
Hexlog APIを使用したアプリケーションは、LogManagerから特定の名前を持つロガーに要求します。 LogManagerは、適切なLoggerContextを見つけてから、そこからロガーを取得します。ロガーを作成する必要がある場合は、次のいずれかを含むロガーコンフィグに関連付けられます。a)ロガーと同じ名前、b)親パッケージの名前、またはc)root loggerconfig。 loggerconfigオブジェクトは、構成のロガー宣言から作成されます。 LoggerConfigは、実際にLogeventsを配信するログタルゲットに関連付けられています。
Hexlogを標準traceで使用することの最大の利点は、特定のログステートメントを無効にしながら、変更なしに他のログを印刷できるようにすることができることです。この機能は、ロギング空間、つまり、可能なすべてのロギングステートメントの空間が、いくつかの開発者が選択する基準に従って分類されることを前提としています。ロガーとloggerConfigsの名前はエンティティです。ロガー名はケースに敏感であり、階層的な命名ルールに従います。
ネーミング階層
LoggerConfigは、その名前がドット(
.)が続く場合、別のLoggerConfigの祖先であると言われています。 loggerconfigは、それ自体と子孫のogggerconfigの間に祖先がいない場合、子どものoggerconfigの親であると言われています。
たとえば、 "com.foo"という名前のLoggerconfigは、 "com.foo.Bar"という名前のloggerconfigの親です。同様に、 "hex"は"hex.log"の親であり、 "hex.log.Logger"の祖先です。この命名スキームは、ほとんどの開発者にとって馴染みのあるものでなければなりません。 Root LoggerConfigは階層の上部にあります。それは常に存在し、すべての階層の一部であるという点で例外的です。 ROO LoggerConfigに直接リンクされているロガーは、次のように取得できます。
var rootLogger = LogManager . getLogger ( " " );
// or more simply
var rootLogger = LogManager . getRootLogger ();他のすべてのロガーは、目的のロガーの名前を渡すことにより、 Logmanager.getLogger staticメソッドを使用して取得できます。
LoggerContextは、ロギングシステムのアンカーポイントとして機能します。現在、複数のLoggerContextを使用することはできませんが、静的プロパティLogManager.contextの値を変更することにより、LoggerContextの実装を変更できます。
マクロコンテキスト内でロギングを使用する場合は、式を印刷するために特別に設計されたメッセージファクトリとメッセージを事前に設定した既に準備されたMacroLoggerContext使用できます。
LoggerContextにはアクティブなConfigurationがあります。構成には、すべてのLogTarget、コンテキスト全体のフィルター、LoggerConfigsが含まれています。
前述のように、 LogManager.getLoggerを呼び出すことにより、Loggerを作成できます。ロガー自体は直接的なアクションを実行しません。単に名前があり、LoggerConfigに関連付けられています。 AbstractLoggerを拡張し、必要な方法を実装します。構成が変更されると、ロガーは異なるLoggerConfigに関連付けられる可能性があるため、動作が変更されます。
同じ名前のLogManage.getLoggerメソッドを呼び出すと、常にまったく同じロガーオブジェクトへの参照が返されます。つまり、
var x = LogManager . getLogger ( " something " );
var y = LogManager . getLogger ( " something " ); xとy 、まったく同じロガーオブジェクトを参照してください。 ( x == yは常にtrueです)
Hexlog環境の構成は、アプリケーションの初期化時に常に行われます。
Hexlogを使用すると、ソフトウェアコンポーネントによるロガーに簡単に名前を付けることができます。これは、各クラスにロガーをインスタンス化することで実現できます。ロガー名は、クラスの完全な資格のある名前に等しくなります。これは、ロガーを定義する便利で簡単な方法です。ログ出力は生成ロガーの名前を持つため、この命名戦略により、ログメッセージの起源を簡単に識別できます。ただし、これはロガーを命名する可能性のある戦略の1つにすぎません。ヘクスログは、可能なロガーのセットを制限しません。開発者は、必要に応じてロガーにいつでも自由に名前を付けることができます。
利便性のために、HexlogはインポートしてgetLoggerコールを自動的に生成できる一連の関数を提供します。 import.hxファイルを使用する場合に特に便利です。 (例を参照)
追加の利便性方法は、 getLoggerByClassとgetLoggerByInstanceです。これは、Hexlogコンビニエンスクラスを使用できないマクロコンテキストで役立ちます。
LoggerConfigオブジェクトは、ロガーがロギング構成で宣言されたときに作成されます。 LoggerConfigには、LogeVentが任意のLogTargetに渡される前に通過できるフィルターのセットが含まれています。また、イベントの処理に使用する必要があるログタルゲットのセットへの参照も含まれています。
自動ログレベルフィルタリングに加えて、Hexlogは適用できるフィルターを提供します。
フィルターとフィルタリングの詳細
ロガーに基づいてログ要求を選択的に有効または無効にする機能は、写真の一部にすぎません。 Hexlogを使用すると、ロギングリクエストを複数の宛先に印刷できます。 Hexlog Speakでは、出力宛先がlogTargetと呼ばれます。
ログターゲットの詳細
多くの場合、ユーザーは出力先だけでなく、出力形式もカスタマイズしたいと考えています。これは、レイアウトをlogTargetに関連付けることによって達成されます。レイアウトは、ログターゲットがフォーマットされた出力を宛先に送信するのに役立つ一方、ユーザーの希望に合わせてLogeVentをフォーマットする責任があります。
レイアウトの詳細
システムでは、すべてのログステートメントがメッセージオブジェクトで表されます。
メッセージの詳細情報
// Getting logger
var logger = LogManager . getLogger ( " LoggerName " );
// Logging simple message
logger . debug ( " Some message " );
// Logging message with parameters
var name = " World " ;
logger . debug ( " Hello {} " , [ name ]);HexLogクラスを使用しますあなたが広範囲にログインすることを計画しているなら、最初にあなたのクラスからルーガーを取得し、それを使用してあなたのメッセージを送信することをお勧めします
import hex . log . HexLog . * ; // Import all convenience functions
// If you're planning to use logger extensively, first get logger for your class
var logger = getLogger ();
// Gets replaced with:
// var logger = hex.log.LogManager.getLogger("my.current.class");
logger . debug ( " Hello world! " ); // you can now use logger as usual単純なデバッグステートメントが必要で、パフォーマンスについて心配していない場合は、さらに抽象化された関数を使用できます。
import hex . log . HexLog . * ; // Import all convenience functions
debug ( " Hello world " );
info ( " Hello world " );
warn ( " Hello world " );
error ( " Hello world " );
fatal ( " Hello world " );
// Gets replaced with:
// hex.log.LogManager.getLogger("my.current.class").debug("Hello world");
// ... etc // -- You can see this working in hex.log.ConfigurationTest.hx
// Create a new configuration
var configuration = new BasicConfiguration ();
// Create log targets
var traceTarget = new TraceLogTarget ( " Trace " , null , new DefaultTraceLogLayout ());
// Create a logger config and add targets
// (at this point we can also add filters to the configuration etc.)
var lc1 : LoggerConfig = LoggerConfig . createLogger ( " hex " , LogLevel . WARN , null , null ); // Logger will only forward warnings and higher
lc1 . addLogTarget ( traceTarget , LogLevel . ALL , null ); // Target will accept every event that arrives (in this case only warnings+ will be forwarded from the logger anyway)
configuration . addLogger ( lc1 . name , lc1 ); // Add logger config to the configuration
// Apply the configuration
LoggerContext . getContext (). setConfiguration ( configuration );
// Now you can request loggers and log as much you want and they will follow the rules set above
var logger = LogManager . getLogger ( " hex " );
logger . debug ( " test " ); // Fitered by config -> nothing will happen
logger . warn ( " test " ); // will be logged
var logger2 = LogManager . getLogger ( " hex.log " );
logger2 . debug ( " test " ); // Fitered by parent config -> nothing will happen
logger2 . warn ( " test " ); // will be logged
// NOTE: By default root logger is set to LogLevel.ERROR
var logger3 = LogManager . getLogger ( " something " );
logger3 . debug ( " test " ); // Filtered by root logger -> nothing will happen
logger3 . error ( " test " ); // will be logged