Tomcat7からTomcat8に移行した時のメモ
変更点
- Tomcat 7 + Java 6 でのログ内容
catalina.out
2015/01/16 9:26:31 org.apache.catalina.core.StandardService startInternal
情報: サービス Catalina を起動します
- Tomcat 8 + Java 7 でのログ内容
catalina.out
16-Jan-2015 9:26:31.518 INFO [main] org.apache.catalina.core.StandardService.startInternal サービス Catalina を起動します
2行だったものが1行に変更されている。
2行に戻す
これを元の2行に戻すには、conf/logging.propertiesの以下の箇所を
conf/logging.properties
java.util.logging.ConsoleHandler.formatter = org.apache.juli.OneLineFormatter
以下に変えることでTomcat 7と同じ2行になる。(OneLineFormatter -> SimpleFormatter)
conf/logging.properties
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
これで以下のように2行表示になる。
catalina.out
1 15, 2015 12:06:25 午後 org.apache.catalina.core.StandardService startInternal
情報: サービス Catalina を起動します
よく見ると日付のフォーマットも変わっている
今まではjava.util.logging.SimpleFormatter
で保持しているformat
で処理されていたが、
Java 7からsun.util.logging.LoggingSupport
のgetSimpleFormat
で取得したフォーマットが使われる。
Tomcatのconf/logging.propertiesに以下を追加することでJava 6 の時と同じ内容が得られる。
conf/logging.properties
java.util.logging.SimpleFormatter.format = %1$tY/%1$tm/%1$td %1$tk:%1$tM:%1$tS %2$s%n%4$s: %5$s%6$s%n
やっとTomcat 7 + Java 6と同じになった。
catalina.out
2015/01/16 9:26:31 org.apache.catalina.core.StandardService startInternal
情報: サービス Catalina を起動します
補足情報
日付書式確認用ソース
package jp.kajiken.format;
import java.text.MessageFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.logging.Level;
import java.util.logging.LogRecord;
import java.util.logging.SimpleFormatter;
public class TestFormat {
public static void main(String[] args) {
// テストする日付
Calendar cal = new GregorianCalendar(2015, 0, 2, 8, 50, 59);
Date dat = new Date(cal.getTimeInMillis());
// Java6
System.out.print(new MessageFormat("{0,date} {0,time}").format(new Object[]{dat}));
System.out.println(" org.apache.catalina.core.StandardService startInternal");
System.out.println("情報: サービス Catalina を起動します");
System.out.println("---");
// Java7
System.setProperty("java.util.logging.SimpleFormatter.format",
"%1$tY/%1$tm/%1$td %1$tk:%1$tM:%1$tS %2$s%n%4$s: %5$s%6$s%n");
LogRecord log = new LogRecord(Level.INFO, "サービス Catalina を起動します");
log.setSourceClassName("org.apache.catalina.core.StandardService");
log.setSourceMethodName("startInternal");
log.setMillis(dat.getTime());
SimpleFormatter sf = new SimpleFormatter();
System.out.println(sf.format(log));
}
}
実行結果
stdout
2015/01/02 8:50:59 org.apache.catalina.core.StandardService startInternal
情報: サービス Catalina を起動します
---
2015/01/02 8:50:59 org.apache.catalina.core.StandardService startInternal
情報: サービス Catalina を起動します
無事に移行前の状態を再現できました。
なぜこんなことをしているのかと言うと、この文字列を使って処理している既存スクリプトがあったのですよ…