今更Loggingメモ

ふと思い立って,java.util.loggingを使ってみることにした.
という訳で,初心者による初心者のためのメモ書き.

検証を怠っている部分があるので,誤解に基づく間違いが含まれる可能性が大いにあり得る.あまり信用しないように.

一番基本的な使い方

public static void main(String args[])
{
  Logger logger = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME);
  logger.config("Config.");
  logger.info("Info.");
  logger.warning("Warning.");
  logger.severe("Severe.");
}

デフォルトの設定にもよるけど,Config が表示されなかったりするはず.

設定ファイルを使う

グローバルなLoggerを使う場合
handlers=java.util.logging.ConsoleHandler
.level=ALL
java.util.logging.ConsoleHandler.level=ALL

のような形のファイルを保存.名前は何でも良いが,ここでは

logging.properties

としておこうか.
(グローバルな設定ファイルと名前がかぶるので,そういうのが嫌いな人は変えるべき)
その上で,

public static void main(String args[])
{
  try {
    InputStream in = new FileInputStream("logging.properties");
    LogManager.getLogManager().readConfiguration(in);
    in.close();
  } catch (IOException e) {
    e.printStackTrace();
  }
  Logger logger = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME);
  logger.config("Config.");
  logger.info("Info.");
  logger.warning("Warning.");
  logger.severe("Severe.");
}

今度は全部表示されるはず.

名前付きのLoggerを使う場合

設定ファイルに

mypackage.level=WARNING

と追記して,

  ...
  Logger logger = Logger.getLogger("mypackage");
  ...

と変更すると,Warning と Severe だけが表示される.

Loggerの親子関係

mypackage という名前の Logger は,mypackage.subpackage という名前の Logger の親のようなものである.
子は親の設定には逆らえない.
例えば,

mypackage.level=WARNING
mypackage.subpackage.level=ALL
  ...
  Logger logger = Logger.getLogger("mypackage.subpackage");
  ...

としても,Warning 以上しか表示されない.
逆に,親の許可する設定を更に絞ることはできて,

mypackage.level=WARNING
mypackage.subpackage.level=SEVERE

とすると,Severe しか表示されなくなる.

名無しの Logger (グローバル?) は最も上位の親であり,

.level=SEVERE

と設定すると,全てのLoggerにおいて Severe しか表示できなくなる.