Использование logback-доступа с Google App Engine (GAE) - PullRequest
4 голосов
/ 22 марта 2012

Я работаю над проектом, который использует GAE в качестве серверной части для мобильного приложения.Мы хотим, чтобы в проекте была реализована действительно хорошая регистрация.Я потратил много времени на чтение log4j, logback-classic, logback-access, java.util.logging (JUL) и slf4j.

Мой вывод заключается в том, что я хочу использовать logback-access, поскольку он имеетнекоторые полезные функции, когда дело доходит до ведения журнала, связанного с http (например, регистрация полных данных запроса при ошибках и т. д.).

Поскольку GAE поддерживает только уровни журнала для JUL, а logback-доступ не поддерживает slf4j, яЯ подумал, что я должен просто установить logback-access и убедиться, что он записывает все журналы через JUL в GAE.

Возможно ли это?Кто-нибудь сделал это и может помочь мне, когда дело доходит до файлов конфигурации для logback-доступа и JUL?Может ли logback-access взаимодействовать напрямую через JUL, без необходимости добавления собственного Appender (я имею в виду соединение с ch.qos.logback.access.jetty.RequestLogImpl, которое можно добавить в конфигурацию в соответствии с документами)?Или конфигурация logback-доступа для Jetty не применяется для GAE?Я что-то не так понял?

Любые советы приветствуются!

Ответы [ 2 ]

3 голосов
/ 26 мая 2012

Мы сделали это и оставались с logback в течение двух лет.Короче говоря, вы в конечном итоге смешаете параметры JUL и logback, поскольку ваше приложение будет использовать logback, а классы Google будут использовать JUL напрямую (и вы не сможете перенаправить JUL в logback в GAE).

После двухгоды мы перешли на конфигурацию 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();
    }

}

Вы также должны применить обходной путь, объясненный здесь , в каком-нибудь прослушивателе приложения при запуске сервера.

0 голосов
/ 25 февраля 2019

Благодаря последним обновлениям вы сможете использовать логи slfj для драйвера стека движка приложения Google.

Вам придется использовать pom зависимость

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-jdk14</artifactId>
</dependency>

Примечание: сделатьуверен, что вы избежите любой другой зависимости slf4j.

И вы можете использовать API регистрации slf4j как

@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

Официальная ссылка на приложение весенней загрузки api - app engine: https://github.com/GoogleCloudPlatform/getting-started-java/tree/master/appengine-standard-java8/springboot-appengine-standard#exclude-jul-to-slf4j-bridge

Я думаю, что это хорошее и чистое решение этой проблемы.

...