Все объединенные журналы докеров с именем контейнера

Поэтому я пытаюсь получить объединенный вывод всех журналов контейнера с его именем контейнера в файле журналаdocker logs --tail -3 с именем контейнера >> файл logst.log.

2 ответа

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

docker ps --format='{{.Names}}' | xargs -P0 -d '\n' -n1 sh -c 'docker logs "$1" | sed "s/^/$1: /"' _
  • docker ps --format='{{.Names}}' - печатать названия контейнеров
  • xargs - для ввода
    • -d '\n' - для каждой строки
    • -P0 - выполнять параллельно с любым количеством параллельных заданий
      • удалите эту опцию, если вы не собираетесь делать docker logs --follow
      • это может вызвать проблемы, рассмотрите возможность добавления stdbuf -oL а также sed -u разблокировать потоки
    • -n1 - передать один аргумент подчиненному процессу
    • sh -c 'script' _ - выполнять скрипт для каждой строки, передавая строку в качестве первого позиционного аргумента
      • docker logs "$1" - получить журналы
      • sed 's/^/$1: /' - добавить имя докера к каждой строке журнала

Но лучшим решением промышленного уровня было бы пересылать журналы докеров на journalctl или другое решение для ведения журнала и используйте эту утилиту для агрегирования и фильтрации журналов.

Понял.

для меня в docker ps -a -q --format "table {{.ID}}"; do { docker ps -a -q --format "table {{.ID}}\t{{.Names}}\n" | grep "$i" и журналы докеров --timestamps --tail 1 "$i"; } >> logs.log; сделанный

logs.log - это общее имя файла.

Другие вопросы по тегам