9

例外がスローされる可能性がある Java アプリケーションを作成しています。これらの例外を try-catch ブロックで処理し、適切なメッセージを出力して、失敗した場合にビジネス ユーザーが醜いスタック トレースを見る必要がないようにしています。

しかし今、デバッグするときに、問題がどこにあるのかを正確に知ることができるように、スタック トレースを出力するような方法で JAR ファイルを呼び出したいと思います。

誰かがこれを達成する方法について教えてもらえますか?

4

4 に答える 4

19

slf4jをファサードとして使用して、実装をすばやく変更し、ロギングの実装としてlogbackを使用できます。slf4j と logback の組み合わせは、現在非常に効率的なロギング システムです。log4j、JDK 1.4、または Jacarta Commons ロギングなどの別の実装を使用する場合は、実装 (バインディング) の jar を必要なものに変更するだけです。logback で slf4j を使用する方法の簡単なユーザー マニュアルに従います。

環境の設定

まず、slf4j を使用するために必要な jar をインポートする必要があります。

日食ガイド

  • Eclipse でプロジェクトに移動し、右クリックします。[プロパティ]を選択します。

  • 左側のパネルからJava Build Pathを選択します

  • ライブラリタブを選択

  • [外部 jar を追加] をクリックします。

  • 解凍したフォルダーを見つけて、 logback-1.0.7フォルダーからlogback-core-1.0.7.jarlogback-classic-1.0.7.jarを追加し、 slf4j-1.7.0からslf4j-api-1.7.0.jarを追加します。フォルダ。[OK] をクリックしてプロジェクトに戻ります。

NetBeans ガイド

  • Netbeans でプロジェクトに移動し、右クリックします。[プロパティ]を選択します。

  • 左側のパネルからライブラリを選択します

  • コンパイルタブを選択

  • [ Jar/フォルダーの追加] をクリックします。

  • 抽出したフォルダーを見つけて、 logback-1.0.7フォルダーからlogback-core-1.0.7.jarlogback-classic-1.0.7.jarを追加し、 slf4j-1.7.0からslf4j-api-1.7.0.jarを追加します。フォルダ。[OK] をクリックしてプロジェクトに戻ります。

*上記の環境を使用していない場合は、クラスパスに上記の 3 つの jar を手動で追加する必要があります。オペレーティング システムによっては、異なる手順に従う必要があります。


ロギング フレームワークの使用

まず、必要な依存関係をインポートする必要があります。

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

ログに記録する各クラスには、プライベート ロガーが必要です。

private final Logger logger = (Logger) LoggerFactory.getLogger(this.getClass())

クラスごとに個別のロガーを用意することで、柔軟性が向上し、ロギング レベル (WARN、ERROR、INFO、DEBUG) を簡単に変更できます。

使用したいログレベルに応じて、持っている必要があります

logger.info("Your info message");

logger.error("Your error message");

logger.debug("Your debug message");

logger.warn("Your warn message");

必要に応じて、より複雑なメソッド呼び出しを使用する可能性もあります。たとえば、デバッグしてスタックトレースも表示したい場合は、使用する必要があります

logger.debug("Your debug message",e);
(e stands for a catched exception).

例えば:

try{       
   //some code  
}catch (IOException e){
   logger.debug("An IOException was thrown at this method ",e);       
   logger.error("An IOException was thrown at this method ",e); 
}

*この時点で、他の構成を追加しなくても、単純なログ システムが作成されます。より高度な構成が必要な場合は、以下に投稿した logback の高度な設定をお読みください。


logback の詳細設定

より高度なログ システムを使用するには、すべてのログ構成を含む追加のファイルを作成する必要があります。この例では、logback.xml を使用します。logback のさまざまなファイルに関する詳細については、logback 構成を参照してください。

この時点で、resources という名前のフォルダーを作成し、それをプロジェクトのビルドパスに追加する必要があります。

日食ガイド

  • resources という名前のフォルダーを作成します (プロジェクトにフォルダーが表示されている必要があります)。

  • Eclipse でプロジェクトに移動し、右クリックします。[プロパティ]を選択します。

  • 左側のパネルからJava Build Pathを選択します

  • ソースタブを選択

  • フォルダの追加をクリック

  • 作成したリソース フォルダーにチェックを入れ、[OK] をクリックします。[OK] をクリックしてプロジェクトに戻ります。

  • この時点で、リソース フォルダーがパッケージとして表示されます。

NetBeans ガイド

  • resources という名前のフォルダーを作成します (プロジェクト ビューにはまだ表示されません。ファイル ビューでのみ表示されます)。

  • Netbeans でプロジェクトに移動し、右クリックします。[プロパティ]を選択します。

  • 左側のパネルから [ソース] を選択します

  • [ソース パッケージ フォルダー] で [フォルダーの追加] をクリックします。

  • リソースフォルダーを選択し、 [OK] をクリックします。

  • パッケージとして作成されたフォルダーが表示されます。

※フォルダ名はお好きな名前で構いません。便宜上、リソースと名付けました。

以下は、Eclipse と Netbeans の両方に適用されます。

*ロギング フレームワークで特定の設定を指定する次のファイルがクラスパスにない場合、DEBUG でルート ロガー レベルが自動的に割り当てられます。つまり、すべてのログ レベルがログに記録されます。デバッグは上位レベルです。

  • logback.xml という名前のフォルダーを作成し、resources フォルダー内に配置します。
  • logback.xml 内に次のタグを配置します。

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>   
        <encoder>
            <pattern>[%-5level] - %msg%n
            </pattern>
        </encoder>
    </appender>
    
    
    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <append>false</append>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>DEBUG</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %class - %msg%n
            </pattern>
        </encoder>
        <File>log/log.txt</File>
    </appender>
    
    
    <logger name="org.test" level="INFO" additivity="false">
        <appender-ref ref="STDOUT" />
    </logger>
    
    <logger name="org.test" level="DEBUG" additivity="false">
        <appender-ref ref="FILE" />
    </logger>
    
    <root level="OFF">
    
    </root>
    

上記の構成には、2 つの異なるアペンダが含まれています。1 つはコンソールに、もう 1 つは log.txt という名前のファイルにあります。ファイルは、log という名前のフォルダーに配置されます。フォルダ ログが存在しない場合は、自動的に作成されます。

どのパターンを使用するかは、メッセージがどれだけ有益かによって異なります。現在の構成では、ログ レベル、スレッド名、クラス名、時間、およびメッセージを含むファイル アペンダーと比較して、コンソール アペンダーは説明が少なく、ログ レベルとメッセージのみを表示します。アプリケーションを実行するたびに新しいログ ファイルを作成するために、append の値を false に設定します。

上記の構成では、同じパッケージに対して 2 つの異なるロガーを使用しています。最初のロガーは情報メッセージのみをコンソールに出力し、2 番目のロガーはデバッグ メッセージをファイルに出力します。これは、アペンダー内に配置されたフィルターを使用して実現されます。

*ロガー名には、クラスの完全修飾名またはパッケージ名を含めることができます。この場合、パッケージ構造 org.test を想定し、このパッケージ内にクラスを配置しました。クラスの完全修飾名がある場合、ロギング構成はこのクラスにのみ適用されます。パッケージ名を使用する場合、このパッケージ内のすべてのクラスは上記の構成に従います。

アペンダーとロガーを使用するにはさまざまな方法があり、ニーズとプログラムの複雑さに依存します。あなたが説明した状況によると、上記の解決策があなたのニーズを満たすことができると思います。

PS より説明的な定義とより高度な構成については、Logback マニュアルを参照してください。

于 2012-09-12T13:28:08.100 に答える
14

Logging レベルを使用しないのはなぜですか。

技術的なエラーのDEBUGと、ユーザーが理解できるビジネス コードのINFOまたはERROR 。

于 2012-09-12T07:14:56.370 に答える
1

このようなことは通常、ロガーとさまざまなログレベルで処理されます。

通常、3つのログレベル、一般的なログ、警告、およびエラーがあります。出力するときに、メッセージがどのレベルであるかを決定します

アプリケーションを起動すると、どのレベルを表示するかをロガーに伝えます。ユーザーの場合、これはエラーになります。最悪のものだけが表示されるはずです。自分の場合は、すべてを出力します。

于 2012-09-12T07:18:13.163 に答える
-3

2つの異なる場所に同じパッケージ/名前で2つのクラスを作成します

public class PrintStackTraceUtil
 {
 public static void printStackTrace(Throwable err)
     {
     //ignore
     }
 }

public class PrintStackTraceUtil
 {
 public static void printStackTrace(Throwable err)
     {
     err.printStackTrace();
     }
 }

Javaプログラムをコンパイルするときは、これらのパスの1つだけをソースパスに入れてください。

于 2012-09-12T07:20:29.477 に答える