我们这样做了,并使用 logback 两年了。简而言之,您最终将混合 JUL 和 logback 设置,因为您的应用程序将使用 logback,而 Google 类将直接使用 JUL(并且您无法将 JUL 重定向到 GAE 中的 logback)。
两年后我们改用了 slf4j + JUL 配置,它更容易并且是单点配置。但这并不容易(警告:下面有大量代码):
日志记录.属性:
.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();
}
}
错误处理程序.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 http://code.google.com/p/googleappengine/issues/detail?id=7467服务器启动时在某些应用程序侦听器上。