Java

Java標準ログ出力サンプル

More than 1 year has passed since last update.

はじめに

このログ出力方法はバッチ実行時のログ出力を行うもので、WEBアプリ等ではログローテ等々有るのであまりオススメ出来ません。
素直にLog4j使ったほうが良いです。

でも、Log4jを何故か使えないような(そもそも入っているのかもわからない)システムで「ログはSystem.out.println()でいい」と言われて「ちょっと待って」と思ったのでまとめておきます。
普通の人は使わないです。

ログフォーマッタ

public class BatchLogFomatter extends SimpleFormatter {

       public String format(LogRecord logRecord) {
          final StringBuffer stringBuffer = new StringBuffer();

          // 日付のフォーマット
          // このバッチはそこまでスレッドに気を使うバッチの想定ではなかったのですが
          // クラス変数に置いておくのは不安なのでformat内で書く
          DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");

          stringBuffer.append(dateFormat.format(new Date(logRecord.getMillis())));
          stringBuffer.append(" ");

          Level level = logRecord.getLevel();
          // 何故かFINE以下が表示されないのでFINE以下はとりあえず設定するだけです。
          // CONF、INFO、WARN、ERRORという名前に変えています。
          // 設定の表示(DEBUG)= CONFとします。
          if (level == Level.FINEST) {
             stringBuffer.append("FINEST");
          } else if (level == Level.FINER) {
             stringBuffer.append("FINER ");
          } else if (level == Level.FINE) {
             stringBuffer.append("FINE ");
          } else if (level == Level.CONFIG) {
             stringBuffer.append("CONF");
          } else if (level == Level.INFO) {
             stringBuffer.append("INFO ");
          } else if (level == Level.WARNING) {
             stringBuffer.append("WARN ");
          } else if (level == Level.SEVERE) {
             stringBuffer.append("ERROR ");
          }

          stringBuffer.append(" ");
          // クラス名が入るようになる(ここではなんだかわからないけどね)
          stringBuffer.append(logRecord.getLoggerName());
          stringBuffer.append(" - ");
          // メッセージが表示される
          stringBuffer.append(logRecord.getMessage());
          // 改行を忘れずに。
          stringBuffer.append("\n");

          // 2017-10-05 18:52:57.592 INFO  hoge.FugaBatch - バッチ実行開始
          // のようなログが出る
          return stringBuffer.toString();

       }
}

実装側

public class LogTest {

    static final Logger logger = Logger.getLogger(LogTest.class.getName());

    static {
        ConsoleHandler handler = new ConsoleHandler();
        // ログレベルの変更
                // ALLにしてもFINE以下が出ない…
        handler.setLevel(Level.ALL);
        handler.setFormatter(new BatchLogFomatter());
        logger.addHandler(handler);
        // これを入れないとログが重複する
        logger.setUseParentHandlers(false);

    }

    public static void main (String[] args) {
        logger.info("INFOで出る");
    }

}

終わりに

バッチ実行なので、必ずログファイルが分かれるので特に細かい事は気にせず
ログだけ出すようにしています。
もっと良いログの出し方無いだろうか。