作成 2002/10/23
ロギングです。
パッケージはjava.util.loggingです。
とりあえず、簡単なの作ってみました。
package log;
import java.util.logging.Logger;
public class SimpleLog {
public static void main(String[] args) throws Exception{
Logger log = Logger.getLogger(SimpleLog.class.getName());
log.info("情報だぜ");
log.warning("警告だぜ");
log.severe("シビアだぜ");
}
}
実行すると、こうなります。
2002/10/23 22:22:29 log.SimpleLog main 情報: 情報だぜ 2002/10/23 22:22:29 log.SimpleLog main 警告: 警告だぜ 2002/10/23 22:22:29 log.SimpleLog main 致命的: シビアだぜ
出力レイアウト(表示項目と見た目を)変えたいじゃん、と思って探してみたんですが、 デフォルトでは、SimpleFormatter、XMLFormatterしかなく、 書式指定する機能が見つかりませんでした。
代案として、Formatterクラスを継承したクラスを自作しました。
MyFormatter.java
package log;
import java.util.logging.Formatter;
import java.util.logging.LogRecord;
public class MyFormatter extends Formatter{
public String format(LogRecord record) {
return record.getSourceClassName()
+ " - "
+ record.getMessage()
+ "\n"
;
}
}
ロギング設定を変更するには、 LogManager#readConfigure(InputStream)するか VM引数で設定ファイルを指定するようです。
ここでは、簡単に設定ファイルを指定してみました。 ちなみにデフォルトの設定ファイルは JREのlib/logging.properties にあります。
logging.properties(自作)
handlers= java.util.logging.ConsoleHandler java.util.logging.ConsoleHandler.level = INFO java.util.logging.ConsoleHandler.formatter = log.MyFormatter
実行するときに
-Djava.util.logging.config.file
オプションで設定ファイルのパスを渡します。
java -Djava.util.logging.config.file=logging.properties log.SimpleLog
実行すると、自作フォーマットで出力されました。
log.SimpleLog - 情報だぜ log.SimpleLog - 警告だぜ log.SimpleLog - シビアだぜ
呼び出し元のソースファイルの行番号を出したいんですが。。。 LogRecordにそれらしいのが見当たらない。。。う〜む。 無理やりStackTraceElementを使って行番号を取得してみました。
package log;
import java.util.logging.Formatter;
import java.util.logging.LogRecord;
public class MyFormatter extends Formatter{
public String format(LogRecord record) {
return record.getSourceClassName()
+ getCalledElement()
+ " - "
+ record.getMessage()
+ "\n"
;
}
private StackTraceElement getCalledElement(){
Throwable t = new Throwable();
StackTraceElement[] st = t.getStackTrace();
return st[8];//数えたら8個前だったから。いいのか?
}
}
実行するとこんな感じ。
log.SimpleLoglog.SimpleLog.main(SimpleLog.java:12) - 情報だぜ log.SimpleLoglog.SimpleLog.main(SimpleLog.java:14) - 警告だぜ log.SimpleLoglog.SimpleLog.main(SimpleLog.java:16) - シビアだぜ
う〜ん。なんだか、正しいやり方でないかもような気がする。
どなたか、もっと簡単な出力レイアウトの設定と簡単な行番号の取得の 方法を知ってたらあったら教えてください。
ちょっと使ってみた感じでは、Log4jの方が便利かも?
アサーション
シンプルな言語設計というポリシーのために?、
実装されていなかったアサーション機能がここに来て、
言語レベルで実装されました。
簡単なの作ってみました。
public class SimpleAssert {
public static void main(String[] args) {
do1(-1);
}
/**
* 何かする1
* @param 引数 事前条件 >= 0
*/
public static void do1(int param){
assert param >= 0;
}
}
アサーション有効でコンパイルするには、-sourceオプションをつけます。
javac -source 1.4 SimpleAssert.java
アサーション有効で実行するには -ea オプションをつけます。
java -ea SimpleAssert
実行するとAssertionErrorってのがスローされました。
java.lang.AssertionError at SimpleAssert.do1(SimpleAssert.java:11) at SimpleAssert.main(SimpleAssert.java:7) Exception in thread "main"
dW アサーションの使用 や Javaのアサーション にちゃんとした解説かいてますね。
javac、java時にわざわざオプション指定するのが手間ですねぇ。 後方互換性のためかしら。
単にAssertException投げるだけなら、 自作AssertクラスやIllegalArgumentException(IllegalStateException)で 事足りる感じもしますが、