将 logback-access 与 Google App Engine (GAE) 结合使用

2024-04-06

我正在开发一个使用 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 的配置文件时指导我? logback-access 可以直接通过 JUL 进行通信,而无需添加自定义 Appender (我正在考虑与 ch.qos.logback.access.jetty.RequestLogImpl 的连接,可以根据文档将其添加到配置中)?或者 Jetty 的 logback-access 配置不适用于 GAE?我是不是搞错了什么?

欢迎任何提示!


我们这样做了,并使用 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服务器启动时在某些应用程序侦听器上。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 logback-access 与 Google App Engine (GAE) 结合使用 的相关文章

随机推荐