我正在开发一个使用GAE作为移动应用程序后端的项目。我们希望在项目中实现非常好的日志记录。我花了很多时间阅读有关log4j,logback-classic,logback-access,java.util.logging(JUL)和slf4j的文章。
我的结论是我想使用logback-access,因为它在记录http相关内容时有一些很好的功能(例如,在出错时记录完整的请求数据等)。
由于GAE仅支持JUL的日志级别,并且logback-access不支持slf4j,我认为我应该只安装logback-access并确保它将所有日志通过JUL写入GAE。
这可能吗?有没有人这样做,并可以指导我在logback-access和JUL的配置文件?可以通过JUL直接进行logback-access通信,而不必添加自定义Appender(我正在考虑可以根据文档添加到配置中的ch.qos.logback.access.jetty.RequestLogImpl的连接)?或者Jetty的logback-access配置是否不适用于GAE?我弄错了什么?
欢迎任何提示!
我们做到了这一点,并且退回了两年。简短的故事是,您将最终混合使用JUL和logback设置,因为您的应用程序将使用logback,而Google类将直接使用JUL(并且您无法将JUL重定向到GAE中的logback)。
两年后我们切换到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
info handler.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();
}
}
error handler.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();
}
}
max level.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的解决方法。
通过最近的更新,您将能够使用slfj日志记录来获取谷歌应用引擎堆栈驱动程序。
您将不得不使用pom依赖项
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-jdk14</artifactId>
</dependency>
注意:确保避免任何其他slf4j依赖项。
你可以使用slf4j logging api作为
@Slf4j
public class MyClass {
...
log.info("Info log with param = {}", param);
...
}
你可以在这里找到更多细节:https://medium.com/@RasAlhague/logging-with-app-engine-spring-boot-2-and-slf4j-b2cb4d9234f9
官方链接到spring boot应用程序api-app引擎:https://github.com/GoogleCloudPlatform/getting-started-java/tree/master/appengine-standard-java8/springboot-appengine-standard#exclude-jul-to-slf4j-bridge
我认为这是解决这个问题的一个很好的解决方案。