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

fos*_*ose 2 logging slf4j amazon-cloudwatch aws-lambda

我遇到的问题是,在 Java 中使用 slf4j(和 io.symphonia:lambda-logging)进行日志记录时,对于日志消息中的每个新行,CloudWatch 都会输出一条新的日志消息。对于使用LOGGER.error(String msg, Throwable t)) 的异常也会发生这种情况

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

fos*_*ose 7

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

<?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>
Run Code Online (Sandbox Code Playgroud)

请参阅<pattern>标签:魔术在%replace(%msg){'\n','&#xd;'}和 中%replace(%exception){'\n','&#xd;'} %nopexception。两个调用都将新行 (\n) 替换为日志消息 (%msg) 的回车 ( ) 和传入的异常 (%exception)。在下面链接的 GitHub 上的对话中描述了为什么第二个参数是 Unicode Hex Character Code 而第一个不是的原因。我将其放入 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);
  }
Run Code Online (Sandbox Code Playgroud)

我是通过GitHub 上的这个对话找到这个解决方案的。