私たちはそれを行い、2年間ログバックしていました。簡単な話は、アプリケーションがログバックを使用し、GoogleクラスがJULを直接使用しているため(そして、JULをGAEのログバックにリダイレクトできないため)、JULとログバックの設定が混在することになります。
私たちは2年後、slf4j + JUL構成に切り替えると、構成がより簡単で単一の構成ポイントになりました。 (:コードのフォローのトン警告):けれどもそれは、簡単ではありません
logging.properties:
.level = INFO
handlers = com.acme.log.InfoHandler,com.acme.log.ErrorHandler
# these should work, but they don't. See
# http://code.google.com/p/googleappengine/issues/detail?id=7467
com.acme.log.InfoHandler.level=ALL
com.acme.log.ErrorHandler.level=WARNING
# Example of log level setup for a single class
# workaround http://code.google.com/p/google-guice/issues/detail?id=488
com.google.inject.internal.util.level = WARNING
InfoHandler.java:
/**
* Logs {@link Level#INFO} to {@link System#out}.
* This class is inspired by {@link ConsoleHandler}
*/
public class InfoHandler extends StreamHandler {
public InfoHandler() {
setOutputStream(System.out);
setFilter(new MaxLevelFilter(Level.WARNING));
}
@Override
public void publish(LogRecord record) {
super.publish(record);
flush();
}
@Override
public void close() {
flush();
}
}
ErrorHandler.java:
public class ErrorHandler extends StreamHandler {
public ErrorHandler() {
setOutputStream(System.err);
}
@Override
public void publish(LogRecord record) {
super.publish(record);
flush();
}
@Override
public void close() {
flush();
}
}
MaxLevel.java:
public class MaxLevelFilter implements Filter {
private final Level maxLevel;
public MaxLevelFilter(Level level) {
this.maxLevel = level;
}
@Override
public boolean isLoggable(LogRecord record) {
return maxLevel.intValue() > record.getLevel().intValue();
}
}
また、サーバーの起動時に、アプリケーションリスナーでhereの回避策を適用する必要があります。
誰もがGAEでjava.util.loggingを使用していますか?または、log4jを使用して独自のAppenderを作成してログレベルを修正しますか? –