Проблема с новой строкой в ​​выходных данных CloutWatch при входе в систему с slf4j (и io.symphonia: lambda-logging) в AWS Lambas - PullRequest
0 голосов
/ 28 декабря 2018

У меня проблема в том, что при входе в систему с помощью slf4j (и io.symphonia: lambda-logging) в Java для каждой новой строки в сообщении журнала CloudWatch выводит новое сообщение журнала.Это также происходит для исключений, использующих LOGGER.error(String msg, Throwable t))

И поскольку сообщения, выводимые CloudWatch, не отсортированы, и несколько сообщений могут поступать из разных Lambdas (или других служб и т. Д.), Журналы становятся нечитаемыми.

(На самом деле, задаю этот вопрос, чтобы ответить на него сам, возможно, чтобы помочь кому-то еще, у кого есть эта проблема, поскольку мне потребовалось некоторое время, чтобы разобраться с этим.)

Ответы [ 2 ]

0 голосов
/ 28 декабря 2018

Одним из решений этой проблемы является установка шаблона регистрации в конфигурации регистрации следующим образом:

<?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) и переданного исключения (% исключение).Причина, по которой второй аргумент находится в шестнадцатеричном коде символов Unicode, а первый - нет, описана в обсуждении на GitHub, связанном ниже.Я поместил это в файл loggerconfig.xml и настроил регистратор на использование его в классе, который является точкой входа для лямбды:

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);
  }

Я пришел к этому решению через this разговор на GitHub.

0 голосов
/ 28 декабря 2018

Использовать multi_line_start_pattern http://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/AgentReference.html. Вы можете установить его в качестве своей временной метки, в этом случае вы получите желаемое поведение:

...