簡體   English   中英

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

[英]Using logback-access with Google App Engine (GAE)

我正在開發一個使用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

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();
    }

}

您還應該在服務器啟動時在某些應用程序偵聽器中應用此處說明的解決方法。

通過最近的更新,您將能夠使用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 application api-app engine的官方鏈接: https//github.com/GoogleCloudPlatform/getting-started-java/tree/master/appengine-standard-java8/springboot-appengine-standard#exclude-jul-to-slf4j -橋

我認為這是解決這個問題的一個很好的解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM