英語版
このページの英語版を見る
std.logger
ロギング機能の実装。
License:
Authors:
基本的なログ記録
メッセージのログは、プログラムの実行時情報を公開するための一般的なアプローチである。 ログは簡単であるべきだが、同時に柔軟かつ強力であるべきである。そのため、D はログ用の標準インターフェースを提供する。 ログメッセージを最も簡単に作成するには、次のように記述する。import std.logger; void main() { log("Hello World"); }これは、stderr デバイスにメッセージを印刷する。メッセージには、 ファイル名、行番号、関数名、時間、 メッセージが含まれる。 より複雑なログ呼び出しは、以下のようになる。
log("sharedLogにデフォルトのLogLevelでロギング"); logf(LogLevel.info, 5 < 6, "LogLevel.infoでsharedLogに%s", "ロギング"); info("sharedLogにinfo LogLevelでロギング"); warning(5 < 6, "5が6より小さい場合、sharedLogにLogLevel.warningでロギング"); error("sharedLogにerror LogLevelでロギング"); errorf("エラー%ssharedLog%sロギング", "で", "に"); critical("5が6未満の場合、","LogLevel.warningでfileLoggerにロギング"); fatal("致命的のLogLevelを持つsharedLogにロギングする"); auto fLogger = new FileLogger("ログファイル名"); fLogger.log("デフォルトのLogLevelを持つfileLoggerにロギングする"); fLogger.info("デフォルトのLogLevelを持つfileLoggerにロギングする"); fLogger.warning(5 < 6, "5が6より小さい場合はLogLevel.warningを持つfileLoggerにロギングする"); fLogger.warningf(5 < 6, "%sが6%sの場合、LogLevel.warningでfileLoggerにロギング", 5, "未満"); fLogger.critical("ファイルロガーにinfoレベルでログ記録するl"); fLogger.log(LogLevel.trace, 5 < 6, "5が6より小さい場合","ファイルロガーにデフォルトレベルでログ記録する"); fLogger.fatal("ファイルロガーに警告レベルでログ記録する");さらに、この例では、新しいFileLogger がどのように作成されるかも示している。 個々のLogger とグローバルログ関数は、データをログに記録するための共通の 関数を共有している。 関数の名前は以下の通りである。
- log
- trace
- info
- warning
- error
- critical
- fatal
sharedLog = new FileLogger("New_Default_Log_File.log");追加のLogger は、必要なLogger の新しいインスタンスを作成することで作成できる。
ログの基本
LogLevel
ログコールのLogLevel は、2つの方法で定義できる。1つ目は、log を呼び出し、LogLevel を最初の引数として明示的に渡す方法である。 ログコールのLogLevel を設定する2つ目の方法は、trace 、info 、warning 、critical 、またはfatal のいずれかを呼び出す方法である。ログコールには、それぞれLogLevel が割り当てられる。LogLevel が定義されていない場合、ログコールは 使用中のLogLevel の現在のLogger を使用する。データが LogLevel fatal デフォルトでError がスローされます。 この動作は、fatalHandler メンバーを使用してLogLevel fatal でログコールを処理するカスタムデリゲートを割り当てることで変更できます。条件付きロギング
条件付きロギングは、bool をログ関数の最初の引数として渡すことで実現できる。 条件付きロギングを使用する場合、 ログメッセージを記録するには、true とする必要がある。 明示的なLogLevel の渡し方を条件付きロギングと組み合わせるには、LogLevel を最初の引数として渡し、その後にbool を渡す。ログメッセージのフィルタリング
メッセージは、ログメッセージのLogLevel が、 使用されているLogger のLogLevel 以上であり、さらに、 ログメッセージのLogLevel がグローバルなLogLevel 以上である場合に ログに記録される。ログ呼び出しに条件が渡される場合、この条件は真でなければならない。 グローバルなLogLevel は、globalLogLevel を使用してアクセスできる。Logger のLogLevel を割り当てるには、ロガーのlogLevel プロパティを使用する。printf形式のログ
printf 形式のログが必要な場合は、f をログの呼び出しに追加する。例えば、myLogger.infof("Hello %s", "world"); やfatalf("errno %d", 1337) など。 関数名に追加されたf により、printf 形式の ログを、明示的なLogLevel と条件付き ログ関数およびメソッドのすべての組み合わせで 利用できる。スレッドローカルリダイレクション
独立したログ関数への呼び出しは、グローバルなLogger sharedLog に直接転送されるわけではない。 実際には、スレッドローカルなLogger の 型StdForwardLogger がログ呼び出しを処理し、デフォルトでは、 作成されたLogger.LogEntry をsharedLog Logger に転送する。 スレッドローカルなLogger は、stdThreadLocalLogプロパティによってアクセスできる。このプロパティを使用して、ユーザー定義のLogger を割り当てることができる。stdThreadLocalLog Logger のデフォルトのLogLevel はLogLevel.allであり、 したがって、すべてのメッセージがsharedLog Logger に転送される。 stdThreadLocalLog のLogLevel は、sharedLog Logger に到達する前にログコールをフィルタリングするために使用できる。ユーザー定義ロガー
Logger の動作をカスタマイズするには、抽象クラスLogger class を継承し、writeLogMsgメソッドを実装した新しいclass を作成する。class MyCustomLogger : Logger { this(LogLevel lv) @safe { super(lv); } override void writeLogMsg(ref LogEntry payload) { // 私のカスタム方法でメッセージを記録する } } auto logger = new MyCustomLogger(LogLevel.info); logger.log("Awesome log message with LogLevel.info");ロギングプロセスをより正確に制御するには、writeLogMsg メソッドをオーバーライドするだけでなく、beginLogMsg 、logMsgPart 、finishLogMsg メソッドもオーバーライドできる。