Używam docker logs [container-name]
zobaczyć dzienniki konkretnego pojemnika.
Czy istnieje elegancki sposób na wyczyszczenie tych dzienników?
Używam docker logs [container-name]
zobaczyć dzienniki konkretnego pojemnika.
Czy istnieje elegancki sposób na wyczyszczenie tych dzienników?
Odpowiedzi:
Z tego pytania jest jedna linijka, którą możesz uruchomić:
echo "" > $(docker inspect --format='{{.LogPath}}' <container_name_or_id>)
lub istnieje podobne polecenie obcinania:
truncate -s 0 $(docker inspect --format='{{.LogPath}}' <container_name_or_id>)
Nie jestem wielkim fanem żadnego z nich, ponieważ bezpośrednio modyfikują pliki Dockera. Zewnętrzne usuwanie dziennika może się zdarzyć, gdy doker zapisuje dane w formacie json do pliku, co powoduje częściową linię i przerywa zdolność do odczytu dowolnych dzienników z docker logs
cli.
Zamiast tego Docker może automatycznie obrócić dzienniki za Ciebie. Odbywa się to za pomocą dodatkowych flag do dockerd, jeśli używasz domyślnego sterownika logowania JSON :
dockerd ... --log-opt max-size=10m --log-opt max-file=3
Możesz również ustawić to jako część pliku daemon.json zamiast modyfikować skrypty startowe:
{
"log-driver": "json-file",
"log-opts": {"max-size": "10m", "max-file": "3"}
}
Te opcje należy skonfigurować z dostępem do konta root. Pamiętaj, aby uruchomić systemctl reload docker
po zmianie tego pliku, aby zastosować ustawienia. To ustawienie będzie wówczas domyślne dla wszystkich nowo utworzonych kontenerów. Uwaga: istniejące kontenery należy usunąć i ponownie utworzyć, aby otrzymać nowe limity dzienników.
Podobne opcje dziennika można przekazać do poszczególnych kontenerów, aby zastąpić te wartości domyślne, co pozwala zapisać więcej lub mniej dzienników na poszczególnych kontenerach. Z docker run
tego wygląda następująco:
docker run --log-driver json-file --log-opt max-size=10m --log-opt max-file=3 ...
lub w pliku tworzenia:
version: '3.7'
services:
app:
image: ...
logging:
options:
max-size: "10m"
max-file: "3"
Aby zaoszczędzić miejsce, możesz przełączyć sterownik dziennika dziennika na „lokalny” sterownik dziennika. Przyjmuje takie same opcje maksymalnego rozmiaru i maksymalnego pliku, ale zamiast przechowywać w Json, używa składni binarnej, która jest szybsza i mniejsza. Umożliwia to przechowywanie większej liczby dzienników w pliku o tym samym rozmiarze. Wpis daemon.json dla tego wygląda następująco:
{
"log-driver": "local",
"log-opts": {"max-size": "10m", "max-file": "3"}
}
Minusem lokalnego sterownika jest to, że zewnętrzne parsery / forwardery dziennika, które zależą od bezpośredniego dostępu do dzienników json, przestaną działać. Więc jeśli używasz narzędzia takiego jak filebeat do wysyłania do Elastic lub uniwersalnego forwardera Splunk, unikałbym „lokalnego” sterownika.
Mam trochę więcej na ten temat w mojej prezentacji Porady i wskazówki .
service docker restart
co samo w sobie nie zadziałało. Musiał też stworzyć nowe kontenery, zanim zaczęły obowiązywać. tzn. samo
echo -n > ...
. W każdym razie chciałbym mieć większą kontrolę nad moimi dziennikami. Na przykład po ponownym uruchomieniu komponentu dokującego chciałbym mieć mechanizm do zrobienia czegoś z zachowanymi dziennikami.
Posługiwać się:
truncate -s 0 /var/lib/docker/containers/*/*-json.log
Możesz potrzebować sudo
sudo sh -c "truncate -s 0 /var/lib/docker/containers/*/*-json.log"
ref. Jeff S. Jak prawidłowo wyczyścić dzienniki dla kontenera Docker?
containers
nie jest dostępna w inny sposób.
sudo sh -c "truncate -s 0 /var/lib/docker/containers/*/*-json.log"
- pracował dla mnie
error from daemon in stream: Error grabbing logs: invalid character '\x00' looking for beginning of value
W Docker dla Windows i Mac oraz prawdopodobnie także innych, można użyć opcji tail. Na przykład:
docker logs -f --tail 100
W ten sposób wyświetlanych jest tylko 100 ostatnich linii i nie musisz najpierw przewijać linii 1M ...
(I dlatego usunięcie dziennika jest prawdopodobnie niepotrzebne)
sudo sh -c "truncate -s 0 /var/lib/docker/containers/*/*-json.log"
sudo sh -c "du -ch /var/lib/docker/containers/*/*-json.log"
, aby uzyskać łączną wielkość kłódsudo sh -c "du -ch /var/lib/docker/containers/*/*-json.log | grep total"
Możesz skonfigurować program logrotate do okresowego czyszczenia dzienników.
Przykładowy plik w /etc/logrotate.d/docker-logs
/var/lib/docker/containers/*/*.log {
rotate 7
daily
compress
size=50M
missingok
delaycompress
copytruncate
}
docker run
? plik /etc/logrotate.d/docker-logs
nie istnieje, muszę go utworzyć?
"log-opts"
jak pokazuje BMitch)
Docker4Mac, rozwiązanie 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
Pierwszy wiersz pobiera ścieżkę do pliku dziennika, podobną do przyjętej odpowiedzi.
Drugi wiersz używa, nsenter
który pozwala uruchamiać polecenia na xhyve
maszynie wirtualnej, która serwuje jako host dla wszystkich kontenerów dokerów w Docker4Mac. Polecenie, które wykonujemy, jest znane truncate -s0 $LOGPATH
z odpowiedzi innych niż Mac.
Jeśli używasz docker-compose
, pierwsza linia staje się:
local LOGPATH=$(docker inspect --format='{{.LogPath}}' $(docker-compose ps -q <service>))
i <service>
jest nazwą usługi z twojego docker-compose.yml
pliku.
Dzięki https://github.com/justincormack/nsenter1 za nsenter
lewę.
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'
Nie możesz tego zrobić bezpośrednio za pomocą polecenia Docker.
Możesz ograniczyć rozmiar dziennika lub użyć skryptu, aby usunąć dzienniki związane z kontenerem. Przykłady skryptów można znaleźć tutaj (czytaj od dołu): Funkcja: Możliwość wyczyszczenia historii dziennika # 1083
Zapoznaj się z sekcją dotyczącą rejestrowania w pliku referencyjnym dotyczącym tworzenia okna dokowanego, w którym można określić opcje (takie jak obrót i limit rozmiaru dziennika) dla niektórych sterowników rejestrowania.
Jako użytkownik root spróbuj uruchomić następujące czynności:
> /var/lib/docker/containers/*/*-json.log
lub
cat /dev/null > /var/lib/docker/containers/*/*-json.log
lub
echo "" > /var/lib/docker/containers/*/*-json.log
Wolę ten (z powyższych rozwiązań):
truncate -s 0 /var/lib/docker/containers/*/*-json.log
Korzystam jednak z kilku systemów (na przykład Ubuntu 18.x Bionic), w których ta ścieżka nie działa zgodnie z oczekiwaniami. Docker jest instalowany przez Snap, więc ścieżka do kontenerów jest bardziej jak:
truncate -s 0 /var/snap/docker/common/var-lib-docker/containers/*/*-json.log
Możesz także podać parametry log-opts w docker run
wierszu poleceń, w następujący sposób:
docker run --log-opt max-size=10m --log-opt max-file=5 my-app:latest
lub w docker-compose.yml jak ten
my-app:
image: my-app:latest
logging:
driver: "json-file"
options:
max-file: "5"
max-size: 10m
Kredyty: https://medium.com/@Quigley_Ja/rotating-docker-logs-keeping-your-overlay-folder-small-40cfa2155412 (James Quigley)
"5"
działa. 10m
Praca bez cytowania rzeczywiście.
Użytkownicy Dockera na komputery Mac, oto rozwiązanie:
Znajdź ścieżkę do pliku dziennika według:
$ docker inspect | grep log
SSH do maszyny dokującej (załóżmy, że nazwa to default
, jeśli nie, uruchom, docker-machine ls
aby się dowiedzieć):
$ docker-machine ssh default
Zmień na użytkownika root ( odniesienie ):
$ sudo -i
Usuń zawartość pliku dziennika:
$ echo "" > log_file_path_from_step1
docker exec -it default sh
do wprowadzenia powłoki sh w pojemniku. Jednak wiele kontenerów domyślnie nie udostępnia sudo
polecenia.
sudo sh -c "du -ch /var/lib/docker/containers/*/*-json.log"