在 AWS Lambas 中使用 slf4j(和 io.symphonia:lambda-logging)记录时 CloudWatch 输出中的新行问题
New line problem in CloudWatch output when logging with slf4j (and io.symphonia:lambda-logging) in AWS Lambas
我遇到了问题,当在 Java 中使用 slf4j(和 io.symphonia:lambda-logging)进行记录时,对于记录消息中的每一行,CloudWatch 都会输出一条新的日志消息。对于使用 LOGGER.error(String msg, Throwable t)
)
的异常也会发生这种情况
并且由于 CloudWatch 输出的消息未排序,并且多条消息可能来自不同的 Lambda(或其他服务等),因此日志变得不可读。
使用multi_line_start_patternhttp://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/AgentReference.html。
您可以将其设置为您的时间戳,在这种情况下您将获得所需的行为:
一个解决方案是在日志配置中设置日志模式,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<configuration packages="com.amazonaws.services.lambda.runtime.log4j2">
<appender name="Lambda" class="io.symphonia.lambda.logging.DefaultConsoleAppender">
<encoder>
<pattern>%date{yyyy-MM-dd HH:mm:ss} %-5level - %logger{0}:%line: %replace(%msg){'\n','
'} %replace(%exception){'\n','
'} %nopexception %n</pattern>
</encoder>
</appender>
<root level="info">
<appender-ref ref="Lambda" />
</root>
</configuration>
查看 <pattern>
标签:神奇之处在于 %replace(%msg){'\n','
'}
和 %replace(%exception){'\n','
'} %nopexception
。这两个调用都将新行 (\n) 替换为回车符 return (
) 用于日志消息 (%msg) 和传入的异常 (%exception)。第二个参数是 Unicode 十六进制字符代码而第一个参数不是的原因在下面链接的 GitHub 上的对话中有所描述。
我将其放入 loggerconfig.xml 并设置记录器以在 class 中使用它,这是 lambda 的入口点,如下所示:
private static final Logger LOGGER;
static {
// must be set before the very first call to LoggerFactory.getLogger()
System.setProperty(ContextInitializer.CONFIG_FILE_PROPERTY, "loggerconfig.xml");
LOGGER = LoggerFactory.getLogger(ClassThatShallLog.class);
}
我通过 GitHub 上的 this 对话找到了这个解决方案。
我遇到了问题,当在 Java 中使用 slf4j(和 io.symphonia:lambda-logging)进行记录时,对于记录消息中的每一行,CloudWatch 都会输出一条新的日志消息。对于使用 LOGGER.error(String msg, Throwable t)
)
并且由于 CloudWatch 输出的消息未排序,并且多条消息可能来自不同的 Lambda(或其他服务等),因此日志变得不可读。
使用multi_line_start_patternhttp://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/AgentReference.html。 您可以将其设置为您的时间戳,在这种情况下您将获得所需的行为:
一个解决方案是在日志配置中设置日志模式,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<configuration packages="com.amazonaws.services.lambda.runtime.log4j2">
<appender name="Lambda" class="io.symphonia.lambda.logging.DefaultConsoleAppender">
<encoder>
<pattern>%date{yyyy-MM-dd HH:mm:ss} %-5level - %logger{0}:%line: %replace(%msg){'\n','
'} %replace(%exception){'\n','
'} %nopexception %n</pattern>
</encoder>
</appender>
<root level="info">
<appender-ref ref="Lambda" />
</root>
</configuration>
查看 <pattern>
标签:神奇之处在于 %replace(%msg){'\n','
'}
和 %replace(%exception){'\n','
'} %nopexception
。这两个调用都将新行 (\n) 替换为回车符 return (
) 用于日志消息 (%msg) 和传入的异常 (%exception)。第二个参数是 Unicode 十六进制字符代码而第一个参数不是的原因在下面链接的 GitHub 上的对话中有所描述。
我将其放入 loggerconfig.xml 并设置记录器以在 class 中使用它,这是 lambda 的入口点,如下所示:
private static final Logger LOGGER;
static {
// must be set before the very first call to LoggerFactory.getLogger()
System.setProperty(ContextInitializer.CONFIG_FILE_PROPERTY, "loggerconfig.xml");
LOGGER = LoggerFactory.getLogger(ClassThatShallLog.class);
}
我通过 GitHub 上的 this 对话找到了这个解决方案。