Googleは最近、Floggerという新しいオープンソースのJavaロギングフレームワークのリリースを発表した。「オープンソースのJavaロギングAPIの分野はすでに非常に煩雑化している」ことを認識した上で、GoogleはFloggerが「既存のロギングAPIに勝る多くの利点」を提供すると主張している。これらの機能強化には、無効化されたログステートメントのコストの削減、全体的な読みやすさの向上、および拡張性の向上が含まれる。
Floggerは、Fluentとロガーのポートマントー(2つの側面を持った機能)であり、その主な利点の1つは「無効化されたレベルのロギングは事実上処理コストがかからない」ということである。他のロギングフレームワークは無効化されたロギングステートメントのためのバイトコードを生成するかもしれないが、Floggerはそれを完全に避けることを目指している。
より具体的には、ロギングフレームワークは典型的には、何百、あるいは何千もの異なる予測不可能なメソッドシグネチャを持つのではなく、ロギングメソッド呼び出し内の未知数のパラメータに対処するためにvarargs
を活用する。このvarargs
を使うことで追加のバイトコードが発生し、具体的にはvarargs
を格納するためのObject[]
を割り当てる。追加のバイトコードに対して特に配慮することはないが、非常にきめ細かいログ記録ステートメントやループ内で発生するログ記録ステートメントがあるアプリケーションでは特に重要になる。
Floggerは、そのAPIの設計を通じてこのコストを回避する。Fluentなコールチェーンは、常に特定のログレベルのセレクタ、たとえばatInfo()
で始まる。このセレクタは、そのレベルでログを記録する実装を返す。無効化されたログステートメントの場合は、シングルトンの何もしない実装を返すことができる。
読みやすさはFloggerが改善するために進歩を遂げているもう一つの分野である。Googleによれば、Floggerはより表現力豊かなFluentなAPIの使用を通してより多くの "自己文書型のログステートメント"を可能にする。例として、エラーを、例外と共に記録する典型的なロギングを考えてみよう。
log.error("The arg, '{}' caused an error", arg, exception)
これと同じステートメントは、Floggerで次のように表現できる。
logger.atError()
.withCause(exception)
.log("The arg, ‘%s’ caused an error", arg);
読みやすさの向上に加えて、Floggerは拡張性を念頭に置いて設計されており、カスタム拡張を可能にする。Floggerを使用すると、「ロギングAPIをローカルに拡張し、Fluentなチェーンにメソッドを追加することができる」。
現時点では、カスタム拡張のドキュメントと例は限られているが、Googleが提供するそのような例の1つは、メインログとは別に書き出される、ユーザーごとにログを記録するUserLogger
を作成することである。
logger.at(INFO)
.forUserId(id)
.log("Message: %s", param);
Floggerに関する追加情報は、Githubのページにあり、入門ガイドとベストプラクティスに関するドキュメントもある。