Я использую, docker logs [container-name]
чтобы увидеть журналы конкретного контейнера.
Есть ли элегантный способ очистить эти журналы?
Я использую, docker logs [container-name]
чтобы увидеть журналы конкретного контейнера.
Есть ли элегантный способ очистить эти журналы?
Ответы:
Из этого вопроса есть одна строка, которую вы можете запустить:
echo "" > $(docker inspect --format='{{.LogPath}}' <container_name_or_id>)
или есть аналогичная команда усечения:
truncate -s 0 $(docker inspect --format='{{.LogPath}}' <container_name_or_id>)
Я не большой поклонник ни одного из них, так как они изменяют файлы Docker напрямую. Удаление внешнего журнала может произойти, когда Docker записывает данные в формате json в файл, что приводит к появлению частичной строки и нарушению возможности чтения любых журналов из docker logs
cli.
Вместо этого вы можете сделать так, чтобы Docker автоматически поворачивал журналы для вас. Это делается с помощью дополнительных флагов для dockerd, если вы используете драйвер ведения журнала JSON по умолчанию :
dockerd ... --log-opt max-size=10m --log-opt max-file=3
Вы также можете установить это как часть вашего файла daemon.json вместо изменения ваших скриптов запуска:
{
"log-driver": "json-file",
"log-opts": {"max-size": "10m", "max-file": "3"}
}
Эти параметры должны быть настроены с правами root. Обязательно запустите systemctl reload docker
после изменения этого файла, чтобы применить настройки. Этот параметр будет по умолчанию для всех вновь создаваемых контейнеров. Обратите внимание, что существующие контейнеры необходимо удалить и создать заново, чтобы получить новые ограничения журнала.
Аналогичные параметры журнала могут быть переданы отдельным контейнерам, чтобы переопределить эти значения по умолчанию, что позволяет вам сохранять больше или меньше журналов для отдельных контейнеров. Из docker run
этого выглядит:
docker run --log-driver json-file --log-opt max-size=10m --log-opt max-file=3 ...
или в файле композиции:
version: '3.7'
services:
app:
image: ...
logging:
options:
max-size: "10m"
max-file: "3"
Для дополнительной экономии места вы можете переключиться с драйвера журнала json на «локальный» драйвер журнала. Он принимает те же параметры max-size и max-file, но вместо сохранения в json использует двоичный синтаксис, который быстрее и меньше. Это позволяет хранить больше журналов в одном файле размера. Запись daemon.json для этого выглядит так:
{
"log-driver": "local",
"log-opts": {"max-size": "10m", "max-file": "3"}
}
Недостатком локального драйвера являются внешние парсеры / пересылки журналов, которые зависят от прямого доступа к журналам json, больше не будут работать. Поэтому, если вы используете такой инструмент, как filebeat для отправки в Elastic, или универсальный перенаправитель Splunk, я бы избегал «локального» драйвера.
У меня есть немного больше об этом в моей презентации Tips and Tricks .
service docker restart
который сам по себе не работал. Также пришлось брендировать создание новых контейнеров, прежде чем оно вступило в силу. то есть, просто подняв старые контейнеры, вы не применили новую регистрацию
echo -n > ...
. В любом случае, я бы хотел иметь больше контроля над моими журналами. Например, после перезапуска docker-compose мне бы хотелось иметь механизм, позволяющий что-то делать с сохраненными журналами.
Использование:
truncate -s 0 /var/lib/docker/containers/*/*-json.log
Вам может понадобиться sudo
sudo sh -c "truncate -s 0 /var/lib/docker/containers/*/*-json.log"
ссылка Джефф С. Как правильно очистить логи для контейнера Docker?
containers
иначе содержимое недоступно.
sudo sh -c "truncate -s 0 /var/lib/docker/containers/*/*-json.log"
- работал для меня
error from daemon in stream: Error grabbing logs: invalid character '\x00' looking for beginning of value
В Docker для Windows и Mac, а также, возможно, и других, можно использовать опцию tail. Например:
docker logs -f --tail 100
Таким образом, отображаются только последние 100 строк, и вам не нужно сначала просматривать 1M строк ...
(И, следовательно, удаление журнала, вероятно, не требуется)
sudo sh -c "truncate -s 0 /var/lib/docker/containers/*/*-json.log"
sudo sh -c "du -ch /var/lib/docker/containers/*/*-json.log"
, чтобы получить только общий размер журналовsudo sh -c "du -ch /var/lib/docker/containers/*/*-json.log | grep total"
Вы можете настроить logrotate для периодической очистки журналов.
Файл примера в /etc/logrotate.d/docker-logs
/var/lib/docker/containers/*/*.log {
rotate 7
daily
compress
size=50M
missingok
delaycompress
copytruncate
}
docker run
? файл /etc/logrotate.d/docker-logs
не существует, я должен его создать?
"log-opts"
как показано BMitch)
Docker4Mac, решение 2018 года:
LOGPATH=$(docker inspect --format='{{.LogPath}}' <container_name_or_id>)
docker run -it --rm --privileged --pid=host alpine:latest nsenter -t 1 -m -u -n -i -- truncate -s0 $LOGPATH
Первая строка получает путь к файлу журнала, аналогично принятому ответу.
Вторая строка использует это, nsenter
что позволяет вам запускать команды в xhyve
виртуальной машине, которые являются серверами в качестве хоста для всех док-контейнеров под Docker4Mac. Команда, которую мы запускаем, знакома truncate -s0 $LOGPATH
из ответов, не относящихся к Mac.
Если вы используете docker-compose
, первая строка становится:
local LOGPATH=$(docker inspect --format='{{.LogPath}}' $(docker-compose ps -q <service>))
и <service>
имя службы из вашего docker-compose.yml
файла.
Спасибо https://github.com/justincormack/nsenter1 за nsenter
хитрость.
docker run -it --rm --privileged --pid=host alpine:latest nsenter -t 1 -m -u -n -i -- sh -c 'truncate -s0 /var/lib/docker/containers/*/*-json.log'
Вы не можете сделать это напрямую через команду Docker.
Вы можете либо ограничить размер журнала, либо использовать скрипт для удаления журналов, связанных с контейнером. Вы можете найти примеры сценариев здесь (читайте снизу): Функция: Возможность очистить историю журнала # 1083
Ознакомьтесь с разделом ведения журнала в справочнике файлов docker-compose, где вы можете указать параметры (например, ротацию журналов и ограничение размера журналов) для некоторых драйверов ведения журналов.
Как пользователь root , попробуйте выполнить следующее:
> /var/lib/docker/containers/*/*-json.log
или
cat /dev/null > /var/lib/docker/containers/*/*-json.log
или
echo "" > /var/lib/docker/containers/*/*-json.log
Я предпочитаю это (из решений выше):
truncate -s 0 /var/lib/docker/containers/*/*-json.log
Однако я использую несколько систем (например, Ubuntu 18.x Bionic), где этот путь не работает должным образом. Docker устанавливается через Snap, поэтому путь к контейнерам больше похож на:
truncate -s 0 /var/snap/docker/common/var-lib-docker/containers/*/*-json.log
Вы также можете указать параметры log-opts в docker run
командной строке, например:
docker run --log-opt max-size=10m --log-opt max-file=5 my-app:latest
или в docker-compose.yml, как это
my-app:
image: my-app:latest
logging:
driver: "json-file"
options:
max-file: "5"
max-size: 10m
Кредиты: https://medium.com/@Quigley_Ja/rotating-docker-logs-keeping-your-overlay-folder-small-40cfa2155412 (Джеймс Куигли)
"5"
это работает. 10m
Работа , не цитируя действительно.
Docker для пользователей Mac, вот решение:
Найти путь к файлу журнала по:
$ docker inspect | grep log
SSH в докер (предположим, что имя default
, если нет, запустите, docker-machine ls
чтобы узнать):
$ docker-machine ssh default
Изменить пользователя root ( ссылка ):
$ sudo -i
Удалить содержимое файла журнала:
$ echo "" > log_file_path_from_step1
docker exec -it default sh
для ввода оболочки sh в контейнер. Однако многие контейнеры неявно делают sudo
команду доступной.
sudo sh -c "du -ch /var/lib/docker/containers/*/*-json.log"