logging - 是否可以在运行时更改 AWS Lambda 的日志级别?

标签 logging aws-lambda log4j slf4j log-level

我在 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;

    }

}

最佳答案

我能够通过使用 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 环境变量设置为适当的级别以查看日志中的相关条目

关于logging - 是否可以在运行时更改 AWS Lambda 的日志级别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51651507/

相关文章:

logging - 使用 .properties 配置文件从 log4j1 迁移到 log4j2

aws-lambda - 如何将 CloudWatch Lambda Insights 添加到无服务器配置?

python - 如何使用 Insert/Modify/Remove 将 dynamodb 设计为 Elastic search

file-upload - 通过 Amazon API 网关和 lambda 上传图像

java - 使用 Log4j2 记录 Spring

java - tomcat 日志存储在一个单独的文件中

tomcat - 如何在 Tomcat 控制台日志中记录 sessionId?

python - 如何使用日志记录 Python 模块写入文件?

java - 是否需要进行 if(log.isDebugEnabled()) { ... } 检查?

python - 在 Python 中禁用和启用从 C++ 模块创建的日志记录