5
java.util.loggingを使用しないのはなぜですか?
私は人生で初めて、オープンソースになるJava APIを書いている立場にいます。うまくいけば、他の多くのプロジェクトに含まれることになります。 ロギングのために、私(そして実際に私が作業している人々)は常にJUL(java.util.logging)を使用しており、JULで問題が発生することはありません。しかし今、私は自分のAPI開発のために何をすべきかをより詳細に理解する必要があります。私はこれについていくつかの調査を行いましたが、得た情報を使用して、さらに混乱します。したがって、この投稿。 私はJUL出身なので、それに偏っています。残りについての私の知識はそれほど大きくありません。 私が行った調査から、人々がJULを嫌うこれらの理由を思いつきました。 「私は日が7月にリリースし、長い前に、Javaで開発を開始し、私がロギングフレームワーク-Xを続けることではなく、何か新しいことを学ぶことのためだけに簡単でした」。うーん。私は冗談ではありません、これは実際に人々が言うことです。この議論があれば、全員がCOBOLを実行できます。(私は確かにこれが怠惰な男であることと自分自身を関連付けることができます) 「JULのログレベルの名前は好きではありません。」真剣に、これは新しい依存関係を導入する理由には不十分です。 「JULからの出力の標準形式が気に入らない」。うーん。これは単なる設定です。コード的に何もする必要はありません。(確かに、昔は、正しいものにするために独自のFormatterクラスを作成する必要があったかもしれません)。 「logging-framework-Xも使用する他のライブラリを使用しているので、それを使用する方が簡単だと思いました」。これは循環論ですよね?「みんな」がJULではなくlogging-framework-Xを使用するのはなぜですか? 「他の誰もがlogging-framework-Xを使用しています」。これは、上記の特別なケースです。大多数が常に正しいとは限りません。 だから本当の大きな問題はなぜJULではないのですか?。私が見逃したものは何ですか?ロギングファサード(SLF4J、JCL)の存在理由は、複数のロギング実装が歴史的に存在しており、その理由は、私が見る限り、JULの前の時代に本当に戻っているためです。JULが完璧だったとしたら、ファサードのロギングは存在しなかったでしょうか。問題をさらに混乱させるのは、JUL自体がある程度ファサードであり、ハンドラー、フォーマッター、さらにはLogManagerさえもスワップできるようにすることです。 同じこと(ロギング)を行う複数の方法を採用するのではなく、そもそもなぜそれらが必要だったのか疑問に思わないでしょうか。(そして、それらの理由がまだ存在するかどうかを確認してください) わかりました、これまでのところ私の研究により、JULの実際の問題であると思われるいくつかのことがわかりました。 パフォーマンス。SLF4Jのパフォーマンスは他より優れていると言う人もいます。これは時期尚早の最適化の場合のようです。1秒あたり数百メガバイトをログに記録する必要がある場合、とにかく正しいパスにいるとは思えません。JULも進化しており、Java 1.4で行ったテストは真実ではなくなっている可能性があります。あなたはそれについてここで読むことができ、この修正はそれをJava 7に取り入れました。多くの人はロギングメソッドでの文字列連結のオーバーヘッドについても話します。ただし、テンプレートベースのロギングはこのコストを回避し、JULにも存在します。個人的には、テンプレートベースのロギングを実際に書くことはありません。そのために怠惰です。たとえば、JULでこれを行う場合: log.finest("Lookup request from username=" + username + ", valueX=" + valueX + ", valueY=" + valueY)); 私のIDEは私に警告し、それを次のように変更するように許可を求めます。 log.log(Level.FINEST, "Lookup request from username={0}, valueX={1}, valueY={2}", new Object[]{username, valueX, valueY}); ..もちろんそれを受け入れます。許可が与えられました!ご協力ありがとうございました。 そのため、私は実際にそのようなステートメントを自分で書くことはありません。それはIDEによって行われます。 パフォーマンスの問題について結論すると、JULのパフォーマンスが競合他社に比べて良くないことを示唆するものは何も見つかりませんでした。 クラスパスからの設定。デフォルトのJULは、クラスパスから構成ファイルをロードできません。数行のコード、それはそうするために。これが煩わしい理由はわかりますが、解決策は短くて簡単です。 出力ハンドラーの可用性。JULには、コンソール、ファイルストリーム、ソケット、メモリの5つの出力ハンドラーが付属しています。これらは拡張することも、新しいものを書くこともできます。これは、たとえば、UNIX / …