Как перенаправить логи Docker-контейнеров в один файл?
Я хочу перенаправить все журналы моего контейнера докера в один файл журнала, чтобы проанализировать их. Я попробовал
docker logs container > /tmp/stdout.log 2>/tmp/stderr.log
но это дает журнал в двух разных файлах. Я уже пробовал
docker logs container > /tmp/stdout.log
но это не сработало.
Ответы
Ответ 1
Нет необходимости перенаправлять журналы.
Докер по умолчанию сохраняет журналы в один файл журнала. Для проверки команды запуска файла журнала:
docker inspect --format='{{.LogPath}}' containername
/var/lib/docker/containers/f844a7b45ca5a9589ffaa1a5bd8dea0f4e79f0e2ff639c1d010d96afb4b53334/f844a7b45ca5a9589ffaa1a5bd8dea0f4e79f0e2ff639c1d010d96afb4b53334-json.log
Откройте этот файл журнала и проанализируйте его.
если вы переадресовываете журналы, тогда перед перенаправлением вы будете получать журналы. вы не сможете увидеть живые журналы.
EDIT:
Чтобы просмотреть живые журналы, вы можете выполнить команду ниже
tail -f `docker inspect --format='{{.LogPath}}' containername`
Примечание:
Этот файл журнала /var/lib/docker/containers/f844a7b45ca5a9589ffaa1a5bd8dea0f4e79f0e2ff639c1d010d96afb4b53334/f844a7b45ca5a9589ffaa1a5bd8dea0f4e79f0e2ff639c1d010d96afb4b53334-json.log
будет создан только в том случае, если журналы для создания докеров выполняются, если журналов нет, тогда этого файла не будет. он похож, как когда-нибудь, если мы запустим команду docker logs containername
и ничего не вернем. В этом случае этот файл будет недоступен.
Ответ 2
Как насчет этого варианта:
docker logs containername >& logs/myFile.log
Он не будет перенаправлять журналы, которые были запрошены в вопросе, а скопировать их один раз в определенный файл.
Ответ 3
docker logs -f <yourContainer> &> your.log &
Объяснение:
-
-f
(то есть --follow
): записывает все существующие журналы и продолжает (следует), регистрируя все, что будет дальше. -
&>
перенаправляет как стандартный вывод, так и стандартную ошибку. - Вероятно, вы хотите запустить этот метод в фоновом режиме, то есть
&
. - Вы можете разделить output и stderr следующим образом:
> output.log 2> error.log
(вместо использования &>
).
Ответ 4
Предполагая, что у вас есть несколько контейнеров, и вы хотите объединить журналы в один файл, вам нужно использовать какой-нибудь агрегатор журналов, такой как fluentd. fluentd поддерживается в качестве драйвера журналирования для док-контейнеров.
Поэтому в docker-compose вам нужно определить драйвер ведения журнала
service1:
image: webapp:0.0.1
logging:
driver: "fluentd"
options:
tag: service1
service2:
image: myapp:0.0.1
logging:
driver: "fluentd"
options:
tag: service2
Вторым шагом было бы обновление fluentd conf для обработки журналов как для службы 1, так и для службы 2
<match service1>
@type copy
<store>
@type file
path /fluentd/log/service/service.*.log
time_slice_format %Y%m%d
time_slice_wait 10m
time_format %Y%m%dT%H%M%S%z
</store>
</match>
<match service2>
@type copy
<store>
@type file
path /fluentd/log/service/service.*.log
time_slice_format %Y%m%d
time_slice_wait 10m
time_format %Y%m%dT%H%M%S%
</store>
</match>
В этой конфигурации мы просим записывать журналы в один файл по этому пути
/fluentd/log/service/service.*.log
и третьим шагом будет запуск настроенного fluentd, который начнет запись журналов в файл.
Вот ссылка для пошаговых инструкций
Долго, но правильный путь, так как вы получаете больший контроль над путями к файлам журналов и т.д., И это хорошо работает и в Docker Swarm.
Ответ 5
Чтобы захватить оба stdout & stderr из вашего контейнера докера в один файл журнала, выполните следующее:
docker logs container > container.log 2>&1
Ответ 6
Это работает для меня:
docker logs <options> containername >& logs/myFile.log
Ответ 7
Поскольку Docker объединяет для нас stdout и stderr, мы можем рассматривать вывод журнала как любой другой поток оболочки. Чтобы перенаправить текущие журналы в файл, используйте оператор перенаправления
$ docker logs test_container > output.log
docker logs -f test_container > output.log
Вместо того, чтобы отправлять вывод в stderr и stdout, перенаправьте вывод ваших приложений в файл и сопоставьте файл с постоянным хранилищем вне контейнера.
$ docker logs test_container>/tmp/output.log
Docker не будет принимать относительные пути в командной строке, поэтому, если вы хотите использовать другой каталог, вам нужно будет использовать полный путь.
Ответ 8
Если вы работаете в Windows и используете PowerShell (как и я), вы можете использовать следующую строку для захвата stdout
и stderr
:
docker logs <containerId> | Out-File 'C:/dev/mylog.txt'
Надеюсь, это кому-нибудь поможет!
Ответ 9
Скрипт Bash для копирования всех журналов контейнеров в указанный каталог:
#!/usr/bin/env bash
TARGET_DIR=~/logs/docker_logs
mkdir -p "$TARGET_DIR"
for name in 'sudo docker ps --format '{{.Names}}'';
do
path=$(sudo docker inspect --format='{{.LogPath}}' $name)
sudo cp -rf "$path" "$TARGET_DIR"/$name.log
done