#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
»