Подтвердить что ты не робот

Сохранять записи журнала в файл в файл

У меня есть модульные тесты, запущенные на моем сервере сборки, и хотелось бы захватить результаты журнала для анализа, когда что-то не удается. Мне еще предстоит найти способ перенаправить вывод docker-compose logs в файл или найти, где сами файлы журнала действительно живут.

Я хочу эквивалент:

docker-compose logs > logs.txt

Изменить - пояснение:

Все мои контейнеры-докеры производят полезные журналы, которые показывают ручной запуск docker-compose logs. Я хочу, чтобы script этот процесс сохранил те же журналы в файле, который является артефактом на моем сервере сборки. По существу, вывод docker-compose logs сохраняется в файл, однако docker-compose logs никогда не выходит.

4b9b3361

Ответ 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 секунд.