java.util.loggingを使用した良い例[終了]


273

プログラムでログを使用したい。java.util.loggingについて聞きましたが、開始方法がわかりません。

ロギングでできることの例はありますか?自分のプログラムでロギングをどのように使用しますか?


7
ここから開始できます:slf4j.org/manual.html
Jeremy

1
Steven Vascellaroに同意します。トピックのポリシングが実用的な目的に達していないため、役立つアイテムが破壊されるのにうんざりしています。さらに、OPがjava.util.loggingについて尋ねたように、Jeremyには敬意を払いません。私はネイティブロギングにも興味があります(回答ありがとう、grwww!)
NOP

データを1行で記録するには、次のようにします。log.log(Level.INFO、 "My message {0}"、new Object [] {m​​yDataId});
Mitja Gustin、

回答:


335

java.util.logging アプリケーションでjarファイルをもう1つ作成する必要がなくなり、優れたFormatterでうまく機能します。

一般に、すべてのクラスの上部には、次のものが必要です。

private static final Logger LOGGER = Logger.getLogger( ClassName.class.getName() );

その後、Loggerクラスのさまざまな機能を使用できます。


実行フローの最上位でデバッグしているLevel.FINEものに使用します。

LOGGER.log( Level.FINE, "processing {0} entries in loop", list.size() );

基本的なフローの問題をデバッグする際に、ループの内側や、常にそれほど詳細を確認する必要のない場所でLevel.FINER/ Level.FINESTを使用します。

LOGGER.log( Level.FINER, "processing[{0}]: {1}", new Object[]{ i, list.get(i) } );

ログ機能のパラメーター化されたバージョンを使用して、GCが対応しなければならない大量の文字列連結ガベージを生成しないようにします。Object[]上記のように、通常、スタック割り当てでは安価です。


例外処理では、常に完全な例外の詳細をログに記録します。

try {
    ...something that can throw an ignorable exception
} catch( Exception ex ) {
    LOGGER.log( Level.SEVERE, ex.toString(), ex );
}

ex.toString()ここでは常にメッセージとして渡します。ログファイルで" grep -n"を " Exception"にすると、メッセージも表示されるためです。それ以外の場合は、スタックダンプによって生成される出力の次の行に表示されます。その行にも一致するように、より高度なRegExを使用する必要があります。


3
これはある種のファイルに書き込みますか?私のプログラムではまだ機能していません。私はあなたが持っている最初のラインを持っていますが、今のところ何も機能していません。
Doug Hauf 2014年

5
どのようにログを表示しますか?私が使用しているライブラリはLoggerオブジェクトを初期化し、.fine()メソッドを使用してログに記録しますが、メッセージを表示できないようです...
Anubian Noob

7
私は1998年からJavaでプログラミングを行っています。Javaでのログインは、必要以上に頭痛の種であることにいつも気づきました。これは、私が読んだJavaにログインする方法の最も簡単な説明です。簡潔すぎる。
スティーブマクロード、

30
誰も言及しておらず、ログファイルを見つけることができるのは興味深いことです。
アーメドフ2016年

4
ログがどこに行くのか疑問に思っている場合は、ロガーのハンドラーを設定していることを確認してください。ログをコンソールに出力するには、新しいConsoleHandlerを使用し、addHandlerメソッドを使用してこれをロガーに追加します。ロガーとハンドラーの両方で必ずsetLevelを呼び出してください。
Craig Brown、

67

ロガーを次のように宣言する必要があります:

private final static Logger LOGGER = Logger.getLogger(MyClass.class.getName());

したがって、クラス名をリファクタリングすると、それに従います。

ここに例挙げて、Javaロガーに関する記事を書きました。


53

多くの例があり、ロギングにはさまざまなタイプがあります。java.util.loggingパッケージを見てください。

コード例:

import java.util.logging.Logger;

public class Main {

  private static Logger LOGGER = Logger.getLogger("InfoLogging");

  public static void main(String[] args) {
    LOGGER.info("Logging an INFO-level message");
  }
}

クラス名をハードコーディングしない場合:

import java.util.logging.Logger;

public class Main {
  private static final Logger LOGGER = Logger.getLogger(
    Thread.currentThread().getStackTrace()[0].getClassName() );

  public static void main(String[] args) {
    LOGGER.info("Logging an INFO-level message");
  }
}

15
なぜログ名を設定しないのMain.class.getSimpleName()ですか?このように、リファクタリングツールは必要に応じて適切に変更しますが、2番目のソリューションほど簡単ではありません。
Pijusn 2013年

3
ロガー名のスタックトレースを実行することは、ハックであり、遅く、正統ではありません。また、壊れて、AOPプロキシまたは他のバイトコーディングの異常な変な名前が表示されます。
アダムゲント2013

9
スタックトレースビジネスの場合は-1。速度が遅く、コンパイラの最適化を妨げる可能性があります。
phooji 2013

4
ロガーを初期化するとき、なぜ「スロー」がまったく問題になるのでしょうか?ほとんどの人は時期尚早の最適化と呼ぶだろう低速について言及しています(はい、コードは少しハックに見えます)。
mikkom 2014年

3
@AndrewMcKinlayどんな状況でそれは何かを壊しますか?ロガータグがクラス名と同じであると想定されている場合、それを行うのはまったく問題ありません。リファクタリングツールは自動的に名前を変更しますが、ハードコードされた文字列の場合、リファクタリングツールはそれをスキップするか、「これも名前を変更しますか?」
Pijusn 2014

23

SLF4Jは、Apache Commons Logging(ACL)よりも優れたロギングファサードです。これは他のロギングフレームワークへのブリッジを備えており、ACL、Log4J、またはJava Util Loggingへの直接呼び出しをSLF4J経由で行うため、必要に応じて、1つのログ構成ファイルだけですべての出力を1つのログファイルに転送できます。アプリケーションで複数のロギングフレームワークを使用するのはなぜですか?使用しているサードパーティのライブラリ、特に古いライブラリはおそらく使用するためです。

SLF4Jは、さまざまなロギング実装をサポートしています。すべてを標準出力に出力したり、Log4Jを使用したり、Logback(Log4Jよりも推奨)を使用したりできます。

http://www.slf4j.org/

http://logback.qos.ch/


9

個人的にはminlogを使います。ロギングクラスは数百行のコードであるため、非常にシンプルです。


3
最小限のフットプリントで、これは選択するライブラリです。
h3xStream

0

Apacheのcommons loggingユーティリティを使用することをお勧めします。それは非常にスケーラブルであり、異なるロガーの個別のログファイルをサポートします。こちらをご覧ください


11
良い提案です!それでも、彼らが尋ねたものに答えようとするか、そうでなければコメントを残してください;)
Ordiel 2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.