[Java] 新しいプロジェクトでlog4jの代わりにlogbackを使うべきですか?


Answers

(LogbackとLog4jの両方の)著者には、 http://logback.qos.ch/reasonsToSwitch.htmlで変更する理由のリストがあります。

ここにいくつかあります。

  • より迅速な実装

    以前のlog4jの作業に基づいて、特定の重要な実行パスで約10倍の速さで実行されるように、ログバック内部が書き直されました。 ログバックコンポーネントは高速になるだけでなく、メモリフットプリントも小さくなります。

  • 構成ファイルの自動再読み込み

    Logback-classicは、変更時に自動的に設定ファイルをリロードできます。 スキャン処理は、スキャン用に別のスレッドを作成する必要がないため、高速かつ安全です。 このテクニカルな機能により、アプリケーションサーバ内で、そしてより一般的にはJEE環境内でログバックがうまく機能するようになります。

  • パッケージデータによるトレースのスタック

    ログバックで例外が出力されると、スタックトレースにパッケージングデータが含まれます。 以下は、logback-demo Webアプリケーションによって生成されたスタックトレースのサンプルです。

    14:28:48.835 [btpool0-7] INFO cqldemo.prime.PrimeAction - 99が有効な値ではありませんjava.lang.Exception:99が無効です
    org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)でのch.qos.logback.demo.prime.PrimeAction.execute(PrimeAction.java:28)[classes /:na] [struts-1.2 .9.jar:1.2.9] at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)[struts-1.2.9.jar:1.2.9] at org.apache.struts.action。 javax.servlet.http.HttpServlet.service(HttpServlet.java:820)のActionServlet.doPost(ActionServlet.java:432)[struts-1.2.9.jar:1.2.9] [servlet-api-2.5-6.1.12] .jar:6.1.12]
    org.server.servlet.ServletHolder.handle(ServletHolder.java:502)[jetty-6.1.12.jar:6.1.12] at ch.qos.logback.demo.UserServletFilter.doFilter(UserServletFilter.java:44) )[classes /:na] org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter(ServletHandler.java:1115)[jetty-6.1.12.jar:6.1.12] at org.mortbay.jetty.servlet。 ServletHandler.handle(ServletHandler.java:361)[jetty-6.1.12.jar:6.1.12] at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:417)[jetty-6.1.12.jar :6.1.12] at org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:230)[jetty-6.1.12.jar:6.1.12]

    上記から、アプリケーションがStrutsバージョン1.2.9を使用していて、jettyバージョン6.1.12の下でデプロイされていることがわかります。 したがって、スタックトレースは、例外で反転したクラスだけでなく、それらが属するパッケージとパッケージのバージョンについて、読者にすばやく通知します。 顧客がスタックトレースを送信すると、開発者は、使用しているパッケージのバージョンに関する情報を送信するように依頼する必要はなくなります。 情報はスタックトレースの一部になります。 詳細については、「%xThrowable」変換ワードを参照してください。

    この機能は、一部のユーザーが間違ってIDEの機能とみなす点で非常に役立ちます。

  • 古いログアーカイブの自動削除

    TimeBasedRollingPolicyまたはSizeAndTimeBasedFNATPのmaxHistoryプロパティを設定すると、アーカイブされたファイルの最大数を制御できます。 ローリングポリシーで毎月のロールオーバが必要な場合に、1年間のログを保持したい場合は、maxHistoryプロパティを12に設定するだけです.12か月以上経過したアーカイブログファイルは自動的に削除されます。

そこに偏りがあるかもしれませんが、同じ人が両方のフレームワークを書いていて、Log4j上のLogbackを使用していると言っているなら、おそらく聞く価値があります。

Question

新しいプロジェクトでは、ログフレームワークとしてlog4jではなくlogbackを使用する必要がありますか?

または、他の言葉で: 'log4jよりもログバックが優れていますか?(SLF4Jを「ログバック」の機能を横に残していますか?)




私は、あなたがlog4jまたはJakarta Commons Loggingを使用するかどうかを決める場合、あなたの決定が同じものになるべきだと思います。他のアプリケーションに含まれるライブラリを開発していますか? もしそうであれば、あなたのライブラリのユーザがあなたの選択したロギングライブラリを使用するように強制するのは公正ではないようです。

答えがノーならば、私はちょうど追加するのが簡単で、あなたがより快適であるものと一緒に行きます。 ログバックのようなサウンドは、log4jと同じように拡張性と信頼性があります。使い慣れている場合は、先に進んでください。




Logback more Java EE対応:
一般的には(コードからドキュメントまで)、複数のアプリケーションがどのように共存するか、クラスローダーの実装方法などを考慮してコンテナを覚えています。ロガー、JNDI、JMXコンフィグレーションなどのコンテキスト

Logbackはパラメータ化されたロギングを追加します(文字列の連結オーバーヘッドを避けるために(logger.isDebugEnabled())を使用する必要はありません)

Log4j - ジャイアントプラスは古いJVMサポート、小型(IMO)NDC(LogbackのみのMDC)、いくつかの拡張機能です。 たとえば、Log4jのconfigureAndWatchの拡張機能を書いたが、Logbackのためのものはなかった