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

Как перенаправить логи Docker-контейнеров в один файл?

Я хочу перенаправить все журналы моего контейнера докера в один файл журнала, чтобы проанализировать их. Я попробовал

docker logs container > /tmp/stdout.log 2>/tmp/stderr.log

но это дает журнал в двух разных файлах. Я уже пробовал

docker logs container > /tmp/stdout.log

но это не сработало.

4b9b3361

Ответ 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