AWSRequestId отсутствует в моих журналах CloudWatch - PullRequest
1 голос
/ 18 октября 2019

Я использую AWS Lambda с Java 8 и использую Log4j2 Logger для печати журналов в CloudWatch, ниже приведена моя конфигурация Log4j2.

<?xml version="1.0" encoding="UTF-8"?>
<Configuration packages="com.amazonaws.services.lambda.runtime.log4j2">
    <Appenders>
        <Lambda name="Lambda">
            <PatternLayout>
                <pattern>%d{yyyy-MM-dd HH:mm:ss} %X{AWSRequestId} %-5p %c{1}:%L - %m%n</pattern>
            </PatternLayout>
        </Lambda>
    </Appenders>
    <Loggers>
        <Root level="info">
            <AppenderRef ref="Lambda"/>
        </Root>
    </Loggers>
</Configuration>

Но CloudWatch не печатает AWSRequestId , как вы можете видеть на следующем рисунке, выглядит так: если идентификатор запроса отсутствует, то он отсутствует для всех журналов этого запроса, а если идентификатор запроса отображается, он отображается для всех журналов этого запроса. запрос (внутри красной коробки) .

enter image description here

1 Ответ

0 голосов
/ 22 октября 2019

Поскольку мы использовали Log4j для ведения журнала, мы исправили эту проблему, добавив AWSRequestId в Log4j ThreadContext в нашем абстрактном классе Lambda-обработчика. Поэтому, когда лямбда-функция получает триггеры, она добавляет AWSRequestId в ThreadContext map и доступна во время печати журнала.

Вот ссылка на Log4j ThreadContext map -> https://logging.apache.org/log4j/2.x/manual/thread-context.html

/**
 * All the lambda handler class should extend this class.
 */
public abstract class AbstractEventHandler<I, O> implements RequestHandler<I, O> {

    @Override
    public O handleRequest(I input, Context context) {
        // As in our implementation, we have created child threads from our main thread
        // but in child threads, Thread ContextMap might not be available.
        // so we need to pass this by setting Log4j property
        // isThreadContextMapInheritable to true.
        System.setProperty("isThreadContextMapInheritable", "true");

        // Adding AWSRequestId in ThreadContext map.
        ThreadContext.put("AWSRequestId", context.getAwsRequestId());
        return requestHandler(input, context);
    }

    abstract protected O requestHandler(I input, Context context);
}
...