Używam docker logs [container-name]
zobaczyć dzienniki konkretnego pojemnika.
Czy istnieje elegancki sposób na wyczyszczenie tych dzienników?
docker
docker-compose
boot2docker
docker-machine
Youssouf Maiga
źródło
źródło
sudo sh -c "du -ch /var/lib/docker/containers/*/*-json.log"
Odpowiedzi:
Z tego pytania jest jedna linijka, którą możesz uruchomić:
lub istnieje podobne polecenie obcinania:
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 :
Możesz również ustawić to jako część pliku daemon.json zamiast modyfikować skrypty startowe:
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:lub w pliku tworzenia:
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:
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 .
źródło
service docker restart
co samo w sobie nie zadziałało. Musiał też stworzyć nowe kontenery, zanim zaczęły obowiązywać. tzn. samoecho -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ę:
Możesz potrzebować sudo
ref. Jeff S. Jak prawidłowo wyczyścić dzienniki dla kontenera Docker?
Odwołanie: Obcinanie pliku podczas jego używania (Linux)
źródło
containers
nie jest dostępna w inny sposób.sudo sh -c "truncate -s 0 /var/lib/docker/containers/*/*-json.log"
- pracował dla mnieerror 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:
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)
źródło
źródło
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
źródło
docker run
? plik/etc/logrotate.d/docker-logs
nie istnieje, muszę go utworzyć?"log-opts"
jak pokazuje BMitch)Docker4Mac, rozwiązanie 2018:
Pierwszy wiersz pobiera ścieżkę do pliku dziennika, podobną do przyjętej odpowiedzi.
Drugi wiersz używa,
nsenter
który pozwala uruchamiać polecenia naxhyve
maszynie wirtualnej, która serwuje jako host dla wszystkich kontenerów dokerów w Docker4Mac. Polecenie, które wykonujemy, jest znanetruncate -s0 $LOGPATH
z odpowiedzi innych niż Mac.Jeśli używasz
docker-compose
, pierwsza linia staje się:i
<service>
jest nazwą usługi z twojegodocker-compose.yml
pliku.Dzięki https://github.com/justincormack/nsenter1 za
nsenter
lewę.źródło
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.
źródło
Jako użytkownik root spróbuj uruchomić następujące czynności:
lub
lub
źródło
Na moich serwerach Ubuntu dostałbym nawet sudo
Cannot open ‘/var/lib/docker/containers/*/*-json.log’ for writing: No such file or directory
Ale czesanie dokera w celu sprawdzenia i obcięcia odpowiedzi zadziałało:
źródło
Wolę ten (z powyższych rozwiązań):
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:
źródło
Możesz także podać parametry log-opts w
docker run
wierszu poleceń, w następujący sposób:lub w docker-compose.yml jak ten
Kredyty: https://medium.com/@Quigley_Ja/rotating-docker-logs-keeping-your-overlay-folder-small-40cfa2155412 (James Quigley)
źródło
"5"
I"10m"
odpowiednio), jak pokazano tutaj dla globalnego pliku daemon.json, ale jest to to samo dla docker-compose.yml. W obu przypadkach wpłynie to tylko na nowo utworzone kontenery."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
źródło
docker exec -it default sh
do wprowadzenia powłoki sh w pojemniku. Jednak wiele kontenerów domyślnie nie udostępniasudo
polecenia.