AWS Lambda регистрирует одну линию JSON - PullRequest
0 голосов
/ 08 мая 2018

У меня есть маленький код Python, выполняющийся в лямбда-AWS, но Lambda помещает логи в CloudWatch Logs в очень неудобном формате: enter image description here

Я хочу отправить эти журналы в ELK для визуализации. Есть ли способ поместить все журналы итераций Lambda в один файл json?

Ответы [ 4 ]

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

Предварительно загруженный LambdaLoggerHandler использует стандартный класс logging.Formatter. Источник: https://www.denialof.services/lambda/

Замените форматтер пользовательским классом, который выводит в JSON. Кроме того, extra dict может содержать дополнительные значения, extra['data'] позволяет избежать конфликтов со свойствами других записей журнала.

import logging
import json

class FormatterJSON(logging.Formatter):
    def format(self, record):
        record.message = record.getMessage()
        if self.usesTime():
            record.asctime = self.formatTime(record, self.datefmt)
        j = {
            'levelname': record.levelname,
            'time': '%(asctime)s.%(msecs)dZ' % dict(asctime=record.asctime, msecs=record.msecs),
            'aws_request_id': getattr(record, 'aws_request_id', '00000000-0000-0000-0000-000000000000'),
            'message': record.message,
            'module': record.module,
            'extra_data': record.__dict__.get('data', {}),
        }
        return json.dumps(j)


logger = logging.getLogger()
logger.setLevel('INFO')

formatter = FormatterJSON(
    '[%(levelname)s]\t%(asctime)s.%(msecs)dZ\t%(levelno)s\t%(message)s\n',
    '%Y-%m-%dT%H:%M:%S'
)
# Replace the LambdaLoggerHandler formatter :
logger.handlers[0].setFormatter(formatter)


def lambda_handler(event, context):
    my_input = {
        'key1': 'value1',
        'key2': 'value2'
    }
    logger.info('Process Info: %s', 'Hello', extra=dict(data=my_input))

Однако любые трассировки стеков сохраняют рендер как обычно.

Тогда CloudWatch получит это:

{
    "levelname": "INFO",
    "time": "2018-12-13T11:35:24.130Z",
    "aws_request_id": "2e0f7055-fecb-11e8-8376-b77695872964",
    "message": "Process Info: Hello",
    "module": "lambda_function",
    "extra_data": {
        "key1": "value1",
        "key2": "value2"
    }
}
0 голосов
/ 09 мая 2018

Вы должны настроить приложение для входа в систему в формате JSON. Таким образом, вы можете записывать всю информацию как одну строку JSON. Это также облегчит анализ нисходящего потока в ELK.

Например, вы можете использовать Сторожевая башня :

import watchtower, logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
logger.addHandler(watchtower.CloudWatchLogHandler())
logger.info("Hi")
logger.info(dict(foo="bar", details={}))

Сюда не входят строки START и END, но вы всегда можете попросить приложение добавить эту информацию, если это необходимо.

0 голосов
/ 03 июня 2018

Попробуйте написать свои логи следующим образом:

import logging
logger = logging.getLogger()
logger.setLevel(logging.INFO)

def my_logging_handler(event, context):
    logger.error(
        json.dumps(
            {
                'key1': 'value1',
                'key2': 'value2'
            }
        )
    )
    return 'Hello from Lambda!'  
0 голосов
/ 08 мая 2018

Короче говоря, нет способа заставить все журналы перейти в один поток журналов. Все они должны быть в одной группе журналов. Лямбда создает новый поток журналов всякий раз, когда развертывается новая версия, или всякий раз, когда запускается новый экземпляр лямбды. У вас есть несколько вариантов получения этих данных в ELK.

  1. Вы можете использовать Плагин Cloudwatch Logstash . Я никогда не использовал его, поэтому не могу ручаться за его легкость и / или эффективность.
  2. Вы можете подключить Журналы Cloudwatch в качестве триггера к другой лямбде, которая выполняет обработку.
  3. Cloudwatch обеспечивает довольно мощный поиск. Вы можете периодически запрашивать данные из Cloudwatch и публиковать их в Logstash.
  4. Было бы вручную отправить эти данные на сервер Logstash, а не регистрировать их в Cloudwatch.
...