是否可以在运行时更改 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 环境变量设置为适当的级别以查看日志中的相关条目
我是 运行 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"
.
对于第二点,您可以将其添加到您的 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 环境变量设置为适当的级别以查看日志中的相关条目