読者です 読者をやめる 読者になる 読者になる

Javaのデバッグ時にトレースログを出力するライブラリ(DebugTrace)を開発

Java 8以降に対応しています。

特徴

  1. インデント対応
  2. マルチスレッド対応
  3. リフレクションを使用した変数内容表示
  4. 変数内容表示の改行処理
  5. クラス名、メソッド名、行番号の自動生成
  6. リソースファイルによるログ内容のカスタマイズ
  7. 各種ロガーを利用可能
    • コンソール出力(stdout, stderr)
    • java.util.logging
    • log4j 1, 2
    • SLF4

インストール方法

GitHubで公開しているので、以下のURLからzipファイルをダウンロードしてください。

URL: https://github.com/MasatoKokubo/DebugTrace/releases

ダウンロードしたzipファイルを解凍して中に入っている debugtrace-x.x.x.jar をプロジェクトのビルドパスに追加してください。

使用方法

デバッグしたいメソッドおよびそのメソッドからコールされるメソッド(必要に応じて)の入口と出口にDebugTrace.enter()DebugTrace.leave()を追加します。またメソッド内で変数の内容をログに出力する場合は、DebugTrace.print(...)を挿入してください。

使用例

package sample;

import org.debugtrace.DebugTrace;

public class Sample1 {
    public static void main(String[] args) {
        DebugTrace.enter();

        DebugTrace.print("args", args);

        DebugTrace.leave();
    }
}

実行すると、以下のログがコンソールに出力されます。

ログ

2015-07-10 15:09:22.060 DebugTrace 1.2.2 / logger wrapper: DebugTrace$$Lambda$2/1831932724
2015-07-10 15:09:22.088 
2015-07-10 15:09:22.089 
2015-07-10 15:09:22.089 ______________________________ main ______________________________
2015-07-10 15:09:22.090 
2015-07-10 15:09:22.095 Enter sample.Sample1.main (7)
2015-07-10 15:09:22.099 |  args = (String[] length:3)[
2015-07-10 15:09:22.099 |  |  0: "aaa",
2015-07-10 15:09:22.099 |  |  1: "bbb",
2015-07-10 15:09:22.100 |  |  2: "ccc",
2015-07-10 15:09:22.100 |  ] (9)
2015-07-10 15:09:22.101 Leave sample.Sample1.main (11)

ログの内容について

ログの最初の行は、DebugTraceが初期化時に出力します。
4行目の ________ main ________などは、最初の起動時かスレッドが切り替わった場合に出力されます。
その後のEnter ...からLeave ...までが、自分で追加したデバッグコードに相当します。
EnterおよびLeaveの出力は、そのコードが記述されたクラス名 (場合によってはパッケージ名も) 、メソッド名、行番号が出力されます。
Enter/Leaveがネストしている場合は、インデントされて出力されます。インデントの管理はスレッド毎になっているため、複数のスレッドがログを出力した場合でも、メソッドコールのネスト状態が分かりやすくなっています。
argsのような配列、Collection、Mapや値タイプではないオブジェクトの出力では、項目毎に改行されます。
変数内容の出力も、階層化されていれば、インデントされて出力され、最後に行番号が付加されます。

変数内容の出力でリフレクションを使用する条件

まずプリミティブ変数やそれらのラッパーオブジェクト(Integerなど)、BigDecimal、Date、Time、Timestamp などの値タイプのオブジェクトの場合、そのクラスのtoStringメソッドかString.formatメソッドを使用して文字化したものを出力します。
その他のクラスの場合で配列、Collection、Mapなどのコンテナタイプのクラスの場合、そのクラスのtoStringメソッドを使用せず、DebugTraceが要素毎の出力を行います。
上記に該当しないクラスの場合、そのクラスまたはObjectクラスを除くスーパークラスにtoStirngメソッドが定義されていれば、そのメソッドを使用してオブジェクトを文字列化します。
toStringメソッドの定義がない場合は、リフレクションを使用してオブジェクトの各フィールド内容を出力します。
ただし出力対象となるフィールドには、以下の条件があります。

  • staticではないこと
  • publicであるか、またはそのフィールドのpublicであるgetメソッドが定義されていること
  • getメソッドは、フィールド名と同じ名前かgetまたはisのプレフィックスのついた名前であること

ロガーの指定方法

DebugTrace.propertiesファイルを作成して、そのフォルダを実行時のクラスパスに含めてください。 このファイルがない場合は、コンソール出力(stdout)になります。
loggerキーの値にロガー名を設定します。

DebugTrace.propertiesの例(Log4j 2を使用する場合)

logger = Log4j2

ロガー名には以下があります。

  • Jdk
  • Log4j
  • Log4j2
  • SLF4J
  • System.out
  • System.err

System.out, System.err以外では、それぞれのロガーの設定ファイルが必要になります。
それらの設定ファイルで使用するロガー名は、org.debugtrace.DebugTraceを指定してください。またログレベルは、デフォルトで各ロガーでの最低レベルになっています。Jdk loggerの場合はfinestで、Log4j 1、2、SLF4Jの場合はtraceです。

log4j2.xmlの例(Log4j 2を使用する場合)

<?xml version="1.0" encoding="UTF-8"?>
<configuration status="WARN">
  <appenders>
    <Console name="Console" target="SYSTEM_OUT">
      <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %5p %msg%n"/>
    </Console>
  </appenders>

  <loggers>
    <logger name="org.debugtrace.DebugTrace" level="trace"/>
    <root level="error">
      <appender-ref ref="Console"/>
    </root>
  </loggers>
</configuration>

終わりに

以上がDebugTraceの紹介となります。
ダウンロードしたzipファイル内のJavaDocには、 DebugTraceクラスの各種メソッドとDebugTrace.propertiesについての詳細な説明の記載があります。