Я використовую 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 записує дані у формат json у файл, що призводить до часткового рядка та порушення можливості читання журналів із docker logs
кліпу.
Натомість, ви можете мати Docker автоматично обертати журнали для вас. Це робиться за допомогою додаткових прапорів до докерда, якщо ви використовуєте за замовчуванням драйвер журналу 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"}
}
Ці параметри потрібно налаштувати з кореневим доступом. Переконайтеся, що запустіть a 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-файлу, але замість зберігання в json він використовує швидший і менший бінарний синтаксис. Це дозволяє зберігати більше журналів у файлі одного розміру. Запис daemon.json для цього виглядає так:
{
"log-driver": "local",
"log-opts": {"max-size": "10m", "max-file": "3"}
}
Недоліком локального драйвера є зовнішні парсери / форвардери журналів, які залежать від прямого доступу до json-журналів більше не працюватимуть. Отже, якщо ви використовуєте такий інструмент, як filebeat, для надсилання Elastic або універсального експедитора Splunk, я б уникав "локального" драйвера.
Про це я дізнався трохи більше у своїй презентації Поради та рекомендації .
service docker restart
яке самостійно не спрацювало. Крім того, довелося створити нові контейнери до вступу в силу. тобто просто виведення старих контейнерів не застосовувалося для нового ведення журналу
echo -n > ...
. У будь-якому разі, я хотів би мати можливість більш контролювати свої журнали. Наприклад, після перезавантаження докер-композиції я хотів би мати механізм робити щось із збереженими журналами.
Використання:
truncate -s 0 /var/lib/docker/containers/*/*-json.log
Можливо, вам знадобиться судо
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, а також, ймовірно, і інших, також можна використовувати хвіст. Наприклад:
docker logs -f --tail 100
Таким чином, відображаються лише останні 100 рядків, і вам не потрібно спочатку прокручувати рядки 1М ...
(Таким чином, видалення журналу, ймовірно, непотрібне)
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"
Ви можете налаштувати логротат, щоб періодично очищати журнали.
Приклад файлу в /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
VM, що сервери як хост для всіх контейнерів докера під 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
Перегляньте розділ ведення журналу посилання на файл докер-композиційного довідника, де ви можете вказати параметри (наприклад, обертання журналу та обмеження розміру журналу) для деяких драйверів реєстрації.
Як користувач 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), де цей шлях працює не так, як очікувалося. Докер встановлюється через Snap, тому шлях до контейнерів більше нагадує:
truncate -s 0 /var/snap/docker/common/var-lib-docker/containers/*/*-json.log
Ви також можете надати параметри журналу опцій у 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 (James Quigley)
"5"
це працює. 10m
Робота , не цитуючи дійсно.
Докер для користувачів 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"