このページは、@wiki で 2011年10月31日 05:48:44 GMT に保存された http://d.hatena.ne.jp/fumokmm/20070724/1185294796 キャッシュです。
ユーザがarchive機能を用いた際、@wikiが対象サイトのrobots.txt,meta情報を考慮し、ページを保存したものです。
そのため、このページの最新版でない場合があります。 こちらから 最新のページを参照してください。
このキャッシュ ページにはすでに参照不可能な画像が使用されている可能性があります。
@wikiのarchve機能についてはこちらを参照ください

@wikiはこのページまたはページ内のコンテンツとは関連ありません。

このページをキャッシュしたwikiに戻る

ログ用にファイル名、クラス名、メソッド名、行番号などを取得 - No Programming, No Life
Hatena::ブログ(Diary)

No Programming, No Life このページをアンテナに追加 RSSフィード Twitter

2007-07-24

ログ用にファイル名、クラス名、メソッド名、行番号などを取得


ログなどにクラス名、メソッド名、行番号などを出力したい場合がある。
エラーや例外が発生した場合はスタックトレース情報が得られるので
そいつを拝借すればどこのクラスの何行目でエラーが発生したのかを
ログに出力させることができるが、エラーや例外でない普通の場合、
どうしたらよいか?


実はJ2SE1.4からThrowable#getStackTrace()が追加されたので
これをうまく使えば実現できる。
Throwable#getStackTrace()はStackTraceElement型の配列を返却する。
各要素がスタックに詰まれた要素(スタックフレーム)の一つとなっている。
スタックの一番上、つまり要素0番目がこのThrowableクラスを生成したメソッドを表す要素となる。


例えば、

ファイル名:Test.java、クラス名:Test、メソッド名:traceTest、
100行目: StackTraceElement[] ste = (new Throwable()).getStackTrace();

と書いたとすると、要素0番目は以下のようになる。

ste[0].getFileName()   → Test.java
ste[0].getClassName()  → Test
ste[0].getLineNumber() → 100
ste[0].getMethodName() → traceTest

もちろん、要素1番目以降はtraceTestメソッドの呼び出しメソッド…
要素2番目はそのまた呼び出しメソッド…と最後まで続いてゆく。
ここでは、Throwableだけど投げずに情報だけ抜き出して使うという技を使った*1


ちなみにJ2SE5.0からはThread#getStackTrace()も追加されたので、

StackTraceElement[] ste = Thread.currentThread().getStackTrace();

みたいな使い方もあり。ただし、この場合要素0番目はスレッドになるので、
要素1番目が呼び出したメソッドとなる。

参考

Silver | Cash Advance | Debt Consolidation | Insurance | Free Credit Report at Nextindex.net
虎の穴 J2SE 5.0 入門 Concurrency Utilities No.2
StackTraceElement (Java 2 Platform SE 5.0)

*1:LogRecordクラスなどのソースを見るとこの技が使われている。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/fumokmm/20070724/1185294796