BT

Apache Log4j 2.0 - アップグレードする価値はあるか?

| 作者: Matt Raible フォローする 11 人のフォロワー , 翻訳者 吉田 英人 フォローする 0 人のフォロワー 投稿日 2014年8月17日. 推定読書時間: 5 分 |

あなたのリクエストに応じて、ノイズを減らす機能を開発しました。大切な情報を見逃さないよう、お気に入りのトピックを選択して、メールとウェブで通知をもらいましょう。

原文(投稿日:2014/07/31)へのリンク

Apache Software Foundationは先日,Log4j 2.0の提供開始を発表した。前バージョンのLog4.j 1.xに対して大幅にパフォーマンスが向上する。開発に数年を費やした今回のリリースは,Log4j 1.xやjava.util.loggingといった既存のロギングソリューションの影響を受けて,スクラッチから書き直されたものだ。

Log4j 2.0では新たにプラグインシステムやプロパティのサポート,JSONベースのコンフィギュレーションのサポート,コンフィギュレーションの自動再ロードなどが導入される。さらにはSLF4JやCommons Logging, Apache Flume, そしてLog4j 1.xなど,既存のロギングフレームワークの多くをサポートし,新たにプログラマ用APIも提供する。

Apache Logging PMCメンバのChristian Grobmeier氏は,2012年12月,この新しいLog4j 2.0を始めて紹介した記事の中で,新たなAPIを次のように説明している。

これまでは,以下のような記述が必要でした。

if (logger.isDebugEnabled()) {
   logger.debug("Hi, " + u.getA() + " " + u.getB());
}

Log4j 2.0チームは,このような場合を検討してAPIを改良しました。これと同じ処理が,次のように記述可能になります。

logger.debug("Hi, {} {}", u.getA(), u.getB());

Grobmeier氏は,MarkerFlow TracingといったAPI改良の説明を続けた上で,プラグインアーキテクチャの改良やコンフィギュレーションの拡張(ホットローディング,JSON, プロパティを使用した),そしてLog4j 1.xにあった多数のデッドロック問題への対処方法についても言及している。

Hacker Newsには,JVM用ロギングフレームワークの急増に対する不満の声が多数上がっている。Log4j, SLF4J, Logbackなど多数のロギングフレームワークの作者であるCeki Gülcü氏は,自身がApacheモデルを好まない理由を説明する。Gülcü氏は現在もコミュニティのメンバであり,Apache LoggingのPMCを続けている。

2013年7月にGrobmeier氏は,新たに“Log4j 2: Performance close to insane”と題する記事を執筆した。その中で氏はRemko Popma氏の“AsyncLoggers”を取り上げて,他フレームワークの12倍以上のロギングスループットを実現した,と絶賛している。

他のフレームワークが毎秒1,500,000程度かそれ以下の環境と同じ条件で,毎秒18,000,000メッセージが可能というのです。

チャートを見ても,すぐには信じられませんでした。何かのまちがいではないのか,もう一度確認しました。自分でテストも実行してみました。その結果,Log4j 2はとにかく速い,ということが分かったのです。

詳細な情報は,Log4jの非同期に関するドキュメントで確認してほしい。

しかしながら,Log4jの非同期機能に誰もが感激している訳ではない。FullContactのシニアプラットフォームエンジニアであるMichael Rose氏は,“Overengineering: Log4j2's AsyncAppender”というブログを書いて,この機能は利用に値しないものだ,と切り捨てている。

結論として,Log4j2のAsyncAppenderは素晴らしくても,単なる見栄えのいいおもちゃであって,現実のアプリケーションでの差はほとんどないのです。Log4j2チームには最大限の敬意を払います。ですが彼らには,またひとつロギングフレームワークを増やして混乱を増長するよりも,ひとつに凝縮された次世代Javaロギングフレームワークの開発に注力してほしいと思っています。

しかしLoopbackは,SLF4J(クラスパス結合ロギングのデファクト標準)のネイティブな実装なのですが,パフォーマンスの面では十分過ぎるくらいです(特にロケーションをオンにした場合には)。私はずっと,このロギングフレームワークを使い続けています。使いやすいですし,利用していて問題にぶつかったこともありません。

少なくともLog4j 1.x(あるいはLog4j2とLogback以外のものはすべて)は使わない方がよいでしょう。負荷の高いシステムで使用していると,いずれ競合問題が発生しますから。

Log4j 1.xから2.0への移行

筆者は先日,自身のAppFuseアプリケーションをLog4.j 1.xを2.0にアップグレードしたところ,Mavenの依存関係の適切な設定が難しいと感じた。最低限として必要なのはlog4j-core JAR(これはlog4j APIに依存している)である。Wepアプリを使っているならば,依存対象としてlog4j-webも必要だ。Velocity 1.7をLog4j 2と同時に使用したければ,log4j-1.2-apiも必要になる。Springを使用するなら,log4j-jclも追加しなければならない(commons-loggingを使用するため)。SLF4Jに依存するライブラリならば,log4j-slf4j-implが必須だ。筆者はHibernateでLog4j 2.0を動作させるために,JBoss Logging 3.2.0.Beta1にアップグレードしなければならなかった。

いくつかの依存定義から,古いLog4jへの依存性を取り除く必要があるかも知れない。Mavenを使用しているのならば,次のコマンドを実行して,削除の必要な依存性を確認するとよいだろう。

    mvn dependency:tree | grep log

最終段階として必要なのは,log4j.xmlをlog4j2.xmlにリネームして,新しいコンフィギュレーションに合うようにリファクタする作業だ。

要約

新しいLog4j 2.0リリースには多くの部分でのパフォーマンス向上,新たなプラグインシステムに加えて,コンフィギュレーション設定が数多く改良されている。しかしこれらの拡張機能に対して,アップグレードや既存のロギングソリューションから移行する価値があるかどうかはユーザ次第だろう。

この記事に星をつける

おすすめ度
スタイル

こんにちは

コメントするには InfoQアカウントの登録 または が必要です。InfoQ に登録するとさまざまなことができます。

アカウント登録をしてInfoQをお楽しみください。

あなたの意見をお聞かせください。

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする
コミュニティコメント

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする

ディスカッション

InfoQにログインし新機能を利用する


パスワードを忘れた方はこちらへ

Follow

お気に入りのトピックや著者をフォローする

業界やサイト内で一番重要な見出しを閲覧する

Like

より多いシグナル、より少ないノイズ

お気に入りのトピックと著者を選択して自分のフィードを作る

Notifications

最新情報をすぐ手に入れるようにしよう

通知設定をして、お気に入りコンテンツを見逃さないようにしよう!

BT