- タマ
- ベテラン
- 会議室デビュー日: 2004/08/08
- 投稿数: 56
|
投稿日時: 2004-09-07 20:45
util.loggingについて教えていただきたいのですが、
ファイル構成が以下のようで
web-inf
/src
//fileA.java
//fileB.java
//log.java
fileAクラス,fileBクラスでエラーが発生した場合、logクラス
内で
logger.log(Level.INFO, エラー内容);
でログをとろうと思っているのですが
以下のようにclass methodが出力元(fileA,fileB)ではなくlogになってしまうのですが
対象法はないでしょうか?
<record>
<date>2004-09-05T00:36:47</date>
<millis>1094312207906</millis>
<sequence>3</sequence>
<logger>tomcat</logger>
<level>INFO</level>
<class>java</class>
<method>out</method>
<thread>10</thread>
<message>Logging Test</message>
</record>
|
- ちょま吉
- 大ベテラン
- 会議室デビュー日: 2004/08/04
- 投稿数: 112
|
投稿日時: 2004-09-08 01:19
| 引用: |
|
未記入さんの書き込み (2004-09-07 20:45) より:
以下のようにclass methodが出力元(fileA,fileB)ではなくlogになってしまうのですが
対象法はないでしょうか?
<record>
<date>2004-09-05T00:36:47</date>
<millis>1094312207906</millis>
<sequence>3</sequence>
<logger>tomcat</logger>
<level>INFO</level>
<class>java</class>
<method>out</method>
<thread>10</thread>
<message>Logging Test</message>
</record>
|
このログ出力のどこがlogになっているのでしょうか?
それにしても、このクラス構成で<class>java</class>とか変なログですね。
|
- さくらば
- 大ベテラン
- 会議室デビュー日: 2002/11/12
- 投稿数: 145
|
投稿日時: 2004-09-08 04:29
こんにちは、さくらばです。
| 引用: |
|
未記入さんの書き込み (2004-09-07 20:45) より:
以下のようにclass methodが出力元(fileA,fileB)ではなくlogになってしまうのですが
対象法はないでしょうか?
<record>
<date>2004-09-05T00:36:47</date>
<millis>1094312207906</millis>
<sequence>3</sequence>
<logger>tomcat</logger>
<level>INFO</level>
<class>java</class>
<method>out</method>
<thread>10</thread>
<message>Logging Test</message>
</record>
|
単純にやるならば、log クラスのメソッドを fileA, fileB クラスからコールするときに
自分のクラス名も引数に入れてあげればいいと思うのですが。
たとえば、log クラスの log メソッドはこんな感じになります。
| コード: |
|
public void log(String sourceClass, String sourceMethod, String message) {
logger.log(Level.INFO, sourceClass, sourceMethod, message);
}
|
もし、クラス名やメソッド名を入れるのは面倒くさいというのであれば、他にも手はあり
ます。以下のコードの引用は java.util.logging.LogRecord クラスでクラス名とメソッド
名を抽出しているメソッドです。
この中で java.util.logging.Logger と比較している部分がありますが、ここを log に
置き換えれば log クラスのメソッドをコールしたクラス名とメソッド名を得ることができ
ます。後はそれを使って、Logger#log(level, sourceClass, sourceMethod, msg)
をコールすればいいだけ。
| コード: |
|
private void inferCaller() {
needToInferCaller = false;
// Get the stack trace.
StackTraceElement stack[] = (new Throwable()).getStackTrace();
// First, search back to a method in the Logger class.
int ix = 0;
while (ix < stack.length) {
StackTraceElement frame = stack[ix];
String cname = frame.getClassName();
if (cname.equals("java.util.logging.Logger")) {
break;
}
ix++;
}
// Now search for the first frame before the "Logger" class.
while (ix < stack.length) {
StackTraceElement frame = stack[ix];
String cname = frame.getClassName();
if (!cname.equals("java.util.logging.Logger")) {
// We've found the relevant frame.
setSourceClassName(cname);
setSourceMethodName(frame.getMethodName());
return;
}
ix++;
}
}
|
|
- ちょま吉
- 大ベテラン
- 会議室デビュー日: 2004/08/04
- 投稿数: 112
|
投稿日時: 2004-09-09 13:28
java.util.logging.LoggerクラスのJavaDocからの引用です。
| 引用: |
|
明示的なソース名とメソッド名を取得しないメソッドの場合、Logging フレームワークは「最善の努力」を行ってどのクラスとメソッドがログメソッドに呼び込まれたかを判定します。ただし、この自動的に推定された情報は、単なる概略的なものかまったく間違っていることさえあることを認識することが重要です。仮想マシンは、JIT コンパイル時に拡張最適化を行うことができ、スタックフレームを完全に削除できますが、クラスとメソッドの呼び出しの確実な検出はできません。
|
だそうです。
|