docker logs [container-name]
Belirli bir kabın günlüklerini görmek için kullanıyorum .
Bu günlükleri temizlemenin zarif bir yolu var mı?
docker logs [container-name]
Belirli bir kabın günlüklerini görmek için kullanıyorum .
Bu günlükleri temizlemenin zarif bir yolu var mı?
Yanıtlar:
Gönderen bu soruya çalıştırabileceğiniz bir tek satırlık var:
echo "" > $(docker inspect --format='{{.LogPath}}' <container_name_or_id>)
veya benzer bir kesilme komutu var:
truncate -s 0 $(docker inspect --format='{{.LogPath}}' <container_name_or_id>)
Docker'ın dosyalarını doğrudan değiştirdikleri için bu ikisinin de büyük bir hayranı değilim. Harici günlük silme işlemi, docker dosyaya json biçimli veriler yazarken kısmi bir satırla sonuçlanabilir ve docker logs
klipten herhangi bir günlük okuma yeteneğini bozabilir.
Bunun yerine, Docker'ın günlükleri sizin için otomatik olarak döndürmesini sağlayabilirsiniz. Varsayılan JSON günlük sürücüsünü kullanıyorsanız, dockerd ek bayraklarıyla yapılır :
dockerd ... --log-opt max-size=10m --log-opt max-file=3
Bunu başlangıç komut dosyalarınızı değiştirmek yerine daemon.json dosyanızın bir parçası olarak da ayarlayabilirsiniz :
{
"log-driver": "json-file",
"log-opts": {"max-size": "10m", "max-file": "3"}
}
Bu seçeneklerin kök erişimi ile yapılandırılması gerekir. systemctl reload docker
Ayarları uygulamak için bu dosyayı değiştirdikten sonra bir çalıştırdığınızdan emin olun . Bu ayar, yeni oluşturulan kapsayıcılar için varsayılan ayar olacaktır. Yeni günlük sınırlarını almak için mevcut kapsayıcıların silinip yeniden oluşturulması gerektiğini unutmayın.
Bu varsayılan değerleri geçersiz kılmak için tek tek kapsayıcılara benzer günlük seçenekleri geçirilerek tek tek kapsayıcılara daha fazla veya daha az günlük kaydetmenize olanak tanır. Bundan docker run
şöyle görünür:
docker run --log-driver json-file --log-opt max-size=10m --log-opt max-file=3 ...
veya bir oluşturma dosyasında:
version: '3.7'
services:
app:
image: ...
logging:
options:
max-size: "10m"
max-file: "3"
Ek alan tasarrufu için json günlük sürücüsünden "yerel" günlük sürücüsüne geçiş yapabilirsiniz. Aynı maksimum boyut ve maksimum dosya seçeneklerini alır, ancak json'da depolamak yerine daha hızlı ve daha küçük bir ikili sözdizimi kullanır. Bu, aynı boyutlu dosyada daha fazla günlük depolamanızı sağlar. Bunun daemon.json girişi şuna benzer:
{
"log-driver": "local",
"log-opts": {"max-size": "10m", "max-file": "3"}
}
Yerel sürücünün dezavantajı, json günlüklerine doğrudan erişime bağlı olan harici günlük ayrıştırıcıları / ileticiler artık çalışmaz. Elastik'e göndermek için dosya atışı gibi bir araç veya Splunk'ın evrensel ileticisini kullanırsanız, "yerel" sürücüden kaçınırım.
İpuçları ve Püf Noktaları sunumumda biraz daha var .
service docker restart
kendi başına iş vermedi ki. Ayrıca, yürürlüğe girmeden önce yeni konteynerler oluşturmak zorunda kaldı. yani sadece eski kapları getirmek yeni günlüğü uygulamadı
echo -n > ...
. Her neyse, günlüklerim üzerinde daha fazla kontrole sahip olmak istiyorum. Örneğin, docker-compose yeniden başlattıktan sonra , korunmuş günlüklerle bir şeyler yapmak için mekanizmaya sahip olmak isterim.
kullanın:
truncate -s 0 /var/lib/docker/containers/*/*-json.log
Sudo'ya ihtiyacınız olabilir
sudo sh -c "truncate -s 0 /var/lib/docker/containers/*/*-json.log"
ref. Jeff S. Docker konteyneri için günlükleri düzgün bir şekilde nasıl temizleyebilirim?
containers
başka türlü kullanılamıyor.
sudo sh -c "truncate -s 0 /var/lib/docker/containers/*/*-json.log"
- benim için çalıştı
error from daemon in stream: Error grabbing logs: invalid character '\x00' looking for beginning of value
sudo sh -c "truncate -s 0 /var/lib/docker/containers/*/*-json.log"
sudo sh -c "du -ch /var/lib/docker/containers/*/*-json.log"
, yalnızca günlüklerin toplamını elde etmek içinsudo sh -c "du -ch /var/lib/docker/containers/*/*-json.log | grep total"
Windows ve Mac için Docker'da ve muhtemelen diğerlerinde de kuyruk seçeneğini kullanmak mümkündür. Örneğin:
docker logs -f --tail 100
Bu şekilde, yalnızca son 100 satır gösterilir ve ilk önce 1 milyon satır arasında ilerlemeniz gerekmez ...
(Ve bu nedenle, günlüğü silmek muhtemelen gereksizdir)
Günlükleri periyodik olarak temizlemek için logrotate ayarlayabilirsiniz.
/Etc/logrotate.d/docker-logs dosyasındaki örnek dosya
/var/lib/docker/containers/*/*.log {
rotate 7
daily
compress
size=50M
missingok
delaycompress
copytruncate
}
docker run
? ile varsayılan olarak kullanılır dosya /etc/logrotate.d/docker-logs
mevcut değil, ben oluşturmak zorunda?
"log-opts"
BMitch tarafından gösterildiği gibi)
Docker4Mac, 2018 çözümü:
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
İlk satır, kabul edilen yanıta benzer şekilde günlük dosyası yolunu alır.
İkinci satır, Docker4Mac altındaki tüm docker kapsayıcıları için ana bilgisayar olarak sunucuların bulunduğu VM'de nsenter
komutları çalıştırmanıza izin veren kullanır xhyve
. Çalıştırdığımız komut, truncate -s0 $LOGPATH
Mac dışı yanıtlardan tanıdık geliyor .
Kullanıyorsanız docker-compose
, ilk satır:
local LOGPATH=$(docker inspect --format='{{.LogPath}}' $(docker-compose ps -q <service>))
ve dosyanızdaki <service>
hizmet adıdır docker-compose.yml
.
Sayesinde https://github.com/justincormack/nsenter1 için nsenter
hile.
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'
Bunu doğrudan bir Docker komutu ile yapamazsınız.
Günlüğün boyutunu sınırlayabilir veya bir kapsayıcıyla ilgili günlükleri silmek için bir komut dosyası kullanabilirsiniz. Senaryo örnekleri burada bulabilirsiniz (alttan okunur): Özellik: Günlük geçmişini temizleme yeteneği # 1083
Check out günlüğü bölümüne bazı günlük sürücüleri için (örneğin günlük rotasyon ve günlük boyutu sınırı gibi) seçenekleri belirtebilirsiniz liman işçisi-oluşturma dosya referansı arasında.
Bir olarak kök kullanıcı aşağıdakileri çalıştırmayı:
> /var/lib/docker/containers/*/*-json.log
veya
cat /dev/null > /var/lib/docker/containers/*/*-json.log
veya
echo "" > /var/lib/docker/containers/*/*-json.log
Bunu (yukarıdaki çözümlerden) tercih ederim:
truncate -s 0 /var/lib/docker/containers/*/*-json.log
Ancak bu yol beklendiği gibi çalışmadığı birkaç sistem (örneğin Ubuntu 18.x Bionic) çalıştırıyorum. Docker Snap üzerinden yüklenir, bu nedenle kaplara giden yol daha çok benzer:
truncate -s 0 /var/snap/docker/common/var-lib-docker/containers/*/*-json.log
Log-opts parametrelerini docker run
komut satırında şu şekilde de sağlayabilirsiniz :
docker run --log-opt max-size=10m --log-opt max-file=5 my-app:latest
veya bunun gibi bir docker-compose.yml dosyasında
my-app:
image: my-app:latest
logging:
driver: "json-file"
options:
max-file: "5"
max-size: 10m
Kredi: https://medium.com/@Quigley_Ja/rotating-docker-logs-keeping-your-overlay-folder-small-40cfa2155412 (James Quigley)
"5"
çalışır. 10m
Gerçekten de alıntı yapmadan çalışır.
Mac kullanıcıları için Docker, işte çözüm:
Günlük dosyası yolunu şu yolla bulun:
$ docker inspect | grep log
SSH docker makinesine ( default
varsa , adı docker-machine ls
bulmak için çalıştırıldığını varsayalım ):
$ docker-machine ssh default
Kök kullanıcı olarak değiştir ( başvuru ):
$ sudo -i
Günlük dosyası içeriğini silin:
$ echo "" > log_file_path_from_step1
docker exec -it default sh
Bir kaba bir sh kabuğu girmek için kullanabilirsiniz . Ancak, birçok kapsayıcı dolaylı olarak sudo
komutu kullanılabilir hale getirmez .
sudo sh -c "du -ch /var/lib/docker/containers/*/*-json.log"