在 AWS Lambas 中使用 slf4j(和 io.symphonia:lambda-logging)进行日志记录时,CloudWatch 输出中出现新行问题

问题描述 投票:0回答:4

我遇到的问题是,在 Java 中使用 slf4j (和 io.symphonia:lambda-logging)进行日志记录时,对于日志消息中的每个新行,CloudWatch 都会输出一条新的日志消息。使用

LOGGER.error(String msg, Throwable t)
)

的异常也会发生这种情况

由于 CloudWatch 输出的消息未排序,并且多条消息可能来自不同的 Lambda(或其他服务等),因此日志变得不可读。

logging aws-lambda slf4j amazon-cloudwatch
4个回答
11
投票

解决此问题的一种方法是在日志记录配置中设置日志记录模式,如下所示:

<?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','&#xd;'} %replace(%exception){'\n','&#xd;'} %nopexception %n</pattern>
    </encoder>
  </appender>

  <root level="info">
    <appender-ref ref="Lambda" />
  </root>
</configuration>

参见

<pattern>
标签:神奇之处在于
%replace(%msg){'\n','&#xd;'}
%replace(%exception){'\n','&#xd;'} %nopexception
。两个调用都将替换新行 ( ) 并带有回车符 ( )用于日志消息 (%msg) 和传入的异常 (%exception)。下面链接的 GitHub 上的对话描述了第二个参数采用 Unicode 十六进制字符代码而第一个参数不是的原因。 我将其放入 loggerconfig.xml 中并设置记录器以在作为 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 对话找到了这个解决方案。


1
投票

使用 multi_line_start_pattern http://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/AgentReference.html。 您可以将其设置为您的时间戳,在这种情况下您将获得所需的行为:


0
投票

log4j2.xml 用于 log4j-slf4j-impl

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn">

    <Appenders>
        <Console name="STDOUT">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} | %-5p | %.20t | %c{0}:%L | %replace{%m %xEx}{\r?\n}{&#xd;}%ex{none}%n" />
        </Console>
    </Appenders>

    <Loggers>
        <Root level="warn">
            <AppenderRef ref="STDOUT" />
        </Root>
        <Logger name="com.company.project" level="debug" />
    </Loggers>

</Configuration>

-1
投票

另一个解决方案是

slf4j-aws-lambda
记录器。

这包装了

aws-lambda-java-core
中的 LambdaLogger。 LambdaLogger 在处理换行符方面有自己的魔力。与
logback
相比,它更小。

更新: 如果您选择 logback,请尝试 jlib AWS Lambda SLF4J/Logback Appender

© www.soinside.com 2019 - 2024. All rights reserved.