在AWS Lambas中使用slf4j(和io.symphonia:lambda-logging)登录时,CloutWatch输出中出现新行问题

时间:2018-12-28 16:04:57

标签: logging aws-lambda slf4j amazon-cloudwatch

我有一个问题,当在Java中使用slf4j(和io.symphonia:lambda-logging)进行记录时,对于Logging消息中的每一行,CloudWatch都会输出一条新的日志消息。使用LOGGER.error(String msg, Throwable t)

的异常也会发生这种情况

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

(实际上是问这个问题自己回答,也许可以帮助有此问题的其他人,因为这花了我一段时间才能弄清楚。)

2 个答案:

答案 0 :(得分:1)

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

<?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中。这两个调用都将换行符(\ n)换成回车符( ),以获取日志消息(%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 :(得分:0)

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