簡體   English   中英

是否可以在運行時更改 AWS Lambda 的日志級別?

[英]Is it possible to change the log level of an AWS Lambda at runtime?

我在 AWS 上運行 Lamba,並使用 slf4j 進行日志記錄

項目要求的一部分是可以在運行時設置日志級別,使用環境變量,但我不確定這是否可能

我正在使用以下代碼,但將 UI 中的環境變量“LOG_LEVEL”更改為“DEBUG”對添加到 CloudWatch 日志的內容沒有影響。 這可能嗎?

import org.apache.log4j.Level;
import org.apache.log4j.LogManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MyLambdaHandler implements RequestHandler<Integer, String> {

    private static final Logger LOGGER = LoggerFactory.getLogger(MyLambdaHandler.class);

    static {
        org.apache.log4j.Logger rootLogger = LogManager.getRootLogger();
        String logLevel = (System.getenv("LOG_LEVEL") != null) ? System.getenv("LOG_LEVEL") : "INFO";
        rootLogger.setLevel(Level.toLevel(logLevel));
    }

    public String myHandler(int myCount, Context context) {

        LOGGER.debug("Entering myHandler lambda handler";
        LOGGER.info("Handling myCount {}", myCount);
        int returnValue = myCount * 2;
        LOGGER.debug("MyHandler return value {}", returnValue);
        return returnValue;

    }

}

是的,這是可能的! 你需要注意兩件事:

  • 一、更新你的lambda環境變量
  • 二、確保log4j會拾取更新

對於第一個問題,您需要做的就是傳遞一個名為JAVA_TOOL_OPTIONS且值為"-DLOG_LEVEL=DEBUG"的 lambda 環境變量。

對於第二點,您可以將其添加到您的 Java 項目src/main/resources/log4j.properties ,內容類似於

log4j.rootCategory=${LOG_LEVEL}, LAMBDA
LOG_LEVEL_PATTERN=%5p
LOG_PATTERN=[%d{yyyy-MM-dd HH:mm:ss.SSS}] boot%X{context} ${LOG_LEVEL_PATTERN} [%t] - %c{1}: %m%n
log4j.appender.LAMBDA=com.amazonaws.services.lambda.runtime.log4j.LambdaAppender
log4j.appender.LAMBDA.layout=org.apache.log4j.PatternLayout
log4j.appender.LAMBDA.layout.conversionPattern=${LOG_PATTERN}

就是這樣!

如果一切順利,您應該很快就會在日志中看到一行內容,例如

Picked up JAVA_TOOL_OPTIONS: -DLOG_LEVEL=DEBUG

並希望開始看到一些調試語句。

請注意LOG_LEVEL如何嵌入到 lambda 變量的值中,而不是作為變量名稱。 這是一種將 JVM 參數提供給 lambda 的有用的間接方法,然后您可以將其用作系統屬性。 感謝https://zenidas.wordpress.com/recipes/system-properties-for-a-java-lambda-function/

我能夠通過使用 log4j2 的亞馬遜版本解決這個問題,並對 log4j2.xml 配置文件進行更改將這些依賴項添加到 maven

<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-lambda-java-log4j2</artifactId>
    <version>1.1.0</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.11.2</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.11.2</version>
</dependency>

在配置中使用logger級別的環境變量

<?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="${env:LOG_LEVEL}">
            <AppenderRef ref="Lambda" />
        </Root>
    </Loggers>
</Configuration>

最后,在 lambda 本身中使用 log4j2 記錄器

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class MyLambdaHandler implements RequestHandler<Void, Void> {

    private static final Logger LOGGER = LogManager.getLogger(MyLambdaHandler .class);

    public Void handleRequest(Void myVoid, Context context) {

        LOGGER.error("Log info enabled: {}", LOGGER.isInfoEnabled());
        LOGGER.info("Info messge");
        LOGGER.error("Log error enabled: {}",  LOGGER.isErrorEnabled());
        LOGGER.error("Error Message");
        LOGGER.error("Log trace enabled: {}",  LOGGER.isTraceEnabled());
        LOGGER.trace("trace message");
        LOGGER.error("Log warning enabled: {}",  LOGGER.isWarnEnabled());
        LOGGER.warn("warn message");
        LOGGER.error("Log debug enabled: {}",  LOGGER.isDebugEnabled());
        LOGGER.debug("debug message");
        return null;

    }

}    

然后將 LOG_LEVEL 環境變量設置為適當的級別以查看日志中的相關條目

暫無
暫無

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

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