ログで行番号を出力する方法

Log4J のカラクリ。基本は Throwable インスタンスからスタックトレースを取得し、そこから情報を抽出する。

サンプルソース

SampleLogger.java

public class SampleLogger {
  
  public static void log(Object message) {
    
    StackTraceElement[] stackTrace = new Throwable().getStackTrace();
    
    // 要素の0番目はThrowableを生成した位置が入り、
    // 1番目にこのメソッドを呼び出したクラス情報が入ります。
    StackTraceElement ste = stackTrace[1];
    
    StringBuffer buf = new StringBuffer();
    buf.append(ste.getClassName())
       .append(".")
       .append(ste.getMethodName())
       .append("(")
       .append(ste.getFileName())
       .append(":")
       .append(ste.getLineNumber())
       .append(") ")
       .append(message);
    
    System.out.println(buf);
  }
}

SampleLoggerClient.java

public class SampleLoggerClient {
  
  public static void main(String[] args) {
      SampleLogger.log("Hello SampleLogger !!");
  }
  
}

実行結果

SampleLoggerClient.main(SampleLoggerClient.java:10) Hello SampleLogger !!