Сохранять записи журнала в файл в файл
У меня есть модульные тесты, запущенные на моем сервере сборки, и хотелось бы захватить результаты журнала для анализа, когда что-то не удается. Мне еще предстоит найти способ перенаправить вывод docker-compose logs
в файл или найти, где сами файлы журнала действительно живут.
Я хочу эквивалент:
docker-compose logs > logs.txt
Изменить - пояснение:
Все мои контейнеры-докеры производят полезные журналы, которые показывают ручной запуск docker-compose logs
. Я хочу, чтобы script этот процесс сохранил те же журналы в файле, который является артефактом на моем сервере сборки. По существу, вывод docker-compose logs
сохраняется в файл, однако docker-compose logs
никогда не выходит.
Ответы
Ответ 1
По умолчанию docker использует драйвер json-file
для записи ваших журналов контейнеров, а исходный вывод json из журналов можно найти в:
/var/lib/docker/containers/[container-id]/[container-id]-json.log
Вы можете получить это местоположение, запустив:
docker inspect --format='{{.LogPath}}' [container-id or container-name]
Когда вы запустите docker-compose logs [service-name]
, docker-compose
будет прикрепляться к сервису (контейнеру), который вы ссылаетесь, и объект LogPrinter выведет содержимое из вышеприведенного файла, но отформатированы, чтобы их было легче читать.
Связанные документы: https://docs.docker.com/compose/compose-file/#logging
Ответ 2
Я не уверен, чего вы пытаетесь достичь. Вы пытаетесь воспроизвести
docker-compose logs > logs.txt
в файле compose в качестве инструкции? Или ваша проблема в том, что перенаправление не "ломает" весь вывод?
В дальнейшем вы можете сделать:
docker-compose logs --no-color >& logs.txt
или
docker-compose logs --no-color |& tee logs.txt
чтобы просмотреть журналы на терминале и выгрузить их в файл одновременно.
Ответ 3
В более позднем выпуске docker-compose 1.7. x+ это исправлено. см. https://github.com/docker/compose/issues/2227 & https://github.com/docker/compose/releases/tag/1.7.0
До этого есть еще один способ добиться этого, решение принятого ответа - прямой доступ к файлам хоста, что может быть неприменимо для случая удаленного доступа/безопасности.
Ниже мы можем получить имя контейнера из команды docker-compose ps
и позволить команде docker logs
зацикливаться
docker-compose ps | tail -n +3 | awk '{print $1}' | xargs -n1 docker logs
Ответ 4
docker-compose logs
команда не прекращает (если не добавить --follow
установка).
Вероятная проблема здесь в том, что журналы настолько велики, что их форматирование и вывод занимает некоторое время. Вы можете уменьшить эту проблему, если ограничите вывод, указав либо/и количество строк, которые вы хотите прочитать, и контейнер, из которого вы хотите прочитать.
Пытаться:
docker-compose logs --no-color --tail=1000 CONTAINER_NAME > logs.txt
(При необходимости измените номер хвоста. Я добавил "--no-color", чтобы упростить вывод, но это не нужно.)
Ответ 5
Решение, которое я принял, основано на ответе Криса МакКиннела с некоторыми улучшениями.
Мне нужно было выгрузить последние записи 1MIO из моего контейнера nginx и docker-compose logs --tail 1000000 nginx > last1mio.log
был слишком медленным, и вывод был не совсем таким, как в обычных файлах nginx.
Это решение, которое работает для меня - вам нужно знать имя вашего контейнера, в моем случае это nginx-1
- я использую container_name:
для исправления этого в docker-compose:
docker inspect --format='{{.LogPath}}' nginx-1 \
| xargs tail -n 1000000 \
| jq -r -j .log > last1mio.log 2>&1
Обратите внимание, что я использую утилиту JQ для анализа json - с некоторыми специальными опциями, чтобы получить формат, такой же, как у оригинальных файлов журнала nginx.
В моем случае сброс последних 1 миллионов строк журнала nginx занимает около 10 секунд.