AWS потоковые многострочные файлы журналов из CloudWatch в ELK - PullRequest
0 голосов
/ 10 ноября 2018

Мы транслируем журналы приложений из CloudWatch в AWS ELK. Наши микросервисы написаны на Java, поэтому я концентрируюсь только на них. Типичная трассировка стека исключений Java при регистрации выглядит следующим образом:

Exception in thread "main" java.lang.NullPointerException
    at com.example.myproject.Book.getTitle(Book.java:16)
    at com.example.myproject.Author.getBookTitles(Author.java:25)
    at com.example.myproject.Bootstrap.main(Bootstrap.java:14)

Как правило, это будет передаваться строка за строкой в ​​стек ELK, что разбивает все сообщение.

Обычно, чтобы вся трассировка стека передавалась как одно сообщение, можно настроить плагин multiline в Logstash или Filebeat.

Есть идеи, как включить многострочное вещание при потоковой передаче файлов журнала из CloudWatch в ELK с помощью AWS lambda?

1 Ответ

0 голосов
/ 11 ноября 2018

Оказалось, что это известная проблема с облачным логгером AWS, см. Комментарий Ричарда Броноского на https://github.com/visionmedia/debug/issues/296

Я провел некоторое тестирование и обнаружил, что записи в журнале CloudWatch можно сделать многострочными. используя \r в качестве разделителя строк. Использование строки \n (Unix) или \r\n (DOS) окончания заканчиваются отдельными записями

Так что я исправил это, добавив следующее ExceptionHandler в Spring Boot RestController

@ExceptionHandler(Throwable.class)
void handleUnhandledExceptions(Throwable e, HttpServletResponse response) throws IOException {
    StringWriter buffer = new StringWriter();
    e.printStackTrace(new PrintWriter(buffer));
    log.error(buffer.toString().replace("\n", "\r"));
    response.sendError(HttpStatus.INTERNAL_SERVER_ERROR.value(), e.getMessage());
} 
...