使用Google App Engine(GAE)的logback-access

问题描述 投票:4回答:2

我正在开发一个使用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?我弄错了什么?

欢迎任何提示!

java google-app-engine jetty logback java.util.logging
2个回答
3
投票

我们做到了这一点,并且退回了两年。简短的故事是,您将最终混合使用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的解决方法。


0
投票

通过最近的更新,您将能够使用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

我认为这是解决这个问题的一个很好的解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.