Потоки журналов представляют собой случайный хэш вместо имени регистратора

#python #amazon-web-services #docker #amazon-cloudwatch

#python #amazon-веб-сервисы #docker #amazon-cloudwatch

Вопрос:

итак, недавно я переместил свое приложение в контейнер docker.

Я заметил, что потоки журналов группы журналов изменили свои имена на некоторый случайный хэш.

Перед переходом в docker:

введите описание изображения здесь

После перехода в docker:

введите описание изображения здесь

Регистратор в каждом файле инициализируется как

 logger = logging.getLogger(__name__)
 

Конфигурация регистратора настраивается внутри __main__ с

 def setup_logger(config_file):
    with open(config_file) as log_config:
        config_yml = log_config.read()
        config_dict = yaml.safe_load(config_yml)
        logging.config.dictConfig(config_dict)
 

с конфигурацией, загруженной из этого файла

 version: 1
disable_existing_loggers: False
formatters:
  json:
    format: "[%(asctime)s] %(process)d %(levelname)s %(name)s:%(funcName)s:%(lineno)s - %(message)s"
  plaintext:
    format: "%(asctime)s %(levelname)s %(name)s - %(message)s"
    datefmt: "%Y-%m-%d %H:%M:%S"
handlers:
  console:
    class: logging.StreamHandler
    formatter: plaintext
    level: INFO
    stream: ext://sys.stdout
root:
  level: DEBUG
  propagate: True
  handlers: [console]
 

Изображение docker запускается с флагами

 --log-driver=awslogs 
      --log-opt awslogs-group=XXXXX 
      --log-opt awslogs-create-group=true 
 

Есть ли способ сохранить исходные имена потоков журналов?

Ответ №1:

Вот как работает драйвер awslogs.

Согласно документации, вы можете несколько управлять именем, используя awslogs-stream-prefix опцию:

Опция awslogs-stream-prefix позволяет связать поток журналов с указанным префиксом, именем контейнера и идентификатором задачи Amazon ECS, к которой принадлежит контейнер. Если вы укажете префикс с этой опцией, поток журнала примет следующий формат:

prefix-name / container-name / ecs-task-id

Если вы не укажете префикс с помощью этой опции, то потоку журнала присваивается имя по идентификатору контейнера, который присваивается демоном Docker экземпляру контейнера. Поскольку сложно отследить журналы до контейнера, который их отправил, используя только идентификатор контейнера Docker (который доступен только в экземпляре контейнера), мы рекомендуем вам указать префикс с этой опцией.

Вы не можете изменить это поведение, если используете драйвер awslogs. Единственным вариантом было бы отключить драйвер журнала и использовать AWS SDK для ручного ввода событий в CloudWatch, но я не думаю, что это было бы хорошей идеей.

Чтобы было понятно, настройки / код вашего контейнера вообще не влияют на имя потока при использовании awslogs — драйвер журнала просто перенаправляет весь стандартный вывод контейнера в CloudWatch.

Комментарии:

1. Спасибо за разъяснение. awslogs-stream-prefix Это позволит мне установить префикс только для всего контейнера, а не для каждого файла, как ранее — правильно ли я это понимаю?

2. Да. Из ответа: «Если вы укажете префикс с этой опцией, то поток журнала примет следующий формат: prefix-name/container-name/ecs-task-id »