Правильный формат регистрации (python) не отправляется в Cloudwatch с помощью сторожевой башни - PullRequest
0 голосов
/ 24 февраля 2019

Я написал следующий код для включения поддержки Cloudwatch.

import logging
from boto3.session import Session
from watchtower import CloudWatchLogHandler

logging.basicConfig(level=logging.INFO,format='[%(asctime)s.%(msecs).03d] [%(name)s,%(funcName)s:%(lineno)s] [%(levelname)s]  %(message)s',datefmt='%d/%b/%Y %H:%M:%S')
log = logging.getLogger('Test')

boto3_session = Session(aws_access_key_id=AWS_ACCESS_KEY_ID,
                aws_secret_access_key=AWS_SECRET_ACCESS_KEY,
                region_name=REGION_NAME)

cw_handler = CloudWatchLogHandler(log_group=CLOUDWATCH_LOG_GROUP_NAME,stream_name=CLOUDWATCH_LOG_STREAM_NAME,boto3_session=boto3_session)
log.addHandler(cw_handler)

Всякий раз, когда я пытаюсь распечатать какой-либо оператор логгера, я получаю разные выходные данные в моей локальной системе и облачном хранилище.

Пример:

log.info("Hello world")

Вывод вышеприведенного оператора logger в моей локальной системе (терминале):

[24/Feb/2019 15:25:06.969] [Test,<module>:1] [INFO]  Hello world

Вывод вышеприведенного оператора logger в cloudwatch (поток журнала):

Hello world

Что-то мне не хватает?

1 Ответ

0 голосов
/ 24 февраля 2019

В среде выполнения Lambda корневой регистратор уже предварительно настроен.Вам придется работать с этим или обходить его.Вы можете выполнить некоторые из следующих действий:

Вы можете установить форматирование непосредственно в корневом логгере:

root = logging.getLogger()
root.setLevel(logging.INFO)
root.handlers[0].setFormatter(logging.Formatter(fmt='[%(asctime)s.%(msecs).03d] [%(name)s,%(funcName)s:%(lineno)s] [%(levelname)s]  %(message)s', datefmt='%d/%b/%Y %H:%M:%S'))

Вы можете добавить к нему обработчик Сторожевой башни (отказ от ответственности: я не пробовал этогоподход):

root = logging.getLogger()
root.addHandler(cw_handler)

Однако мне интересно, нужно ли вам вообще использовать Сторожевую башню.В Lambda каждая строка, которую вы печатаете на stdout (то есть, даже просто используя print), регистрируется в Cloudwatch.Поэтому может быть достаточно использовать стандартный logging интерфейс.

...