Hur man rensar loggar för körande Docker-containrar

Hur man rensar loggar för körande Docker-containrar

[ad_1]

Långvariga Docker-containrar kan snabbt samla ett stort antal stocklinjer. Dessa förbrukar lagringskapacitet och minskar prestandan vid åtkomst till och filtrering av data. Även om Docker inkluderar integrerade verktyg för att visa loggarna, finns det ingen inbyggd mekanism för att rensa upp dem.

I den här artikeln kommer du att lära dig hur du rensar loggarna för körda Docker-behållare, utan att starta om eller ersätta dem. Du kommer också att se några tekniker för att mer effektivt hantera stora loggar och samtidigt behålla gamla data.

Förstå problemet

Docker samlar in loggar från standardutdata och felströmmar från containerförgrundsprocesser. De docker logs kommandot används för att hämta dessa loggar men det låter dig inte ta bort gamla rader.

Docker stöder många olika loggningsdrivrutiner så det är inte möjligt att erbjuda en standardiserad rensningsmekanism. Den här artikeln fokuserar på standarden json-file loggningsdrivrutin, där loggrader lagras i en JSON-fil på din containervärds filsystem. Se dokumentationen till din lagringsdrivrutin om du behöver rensa upp loggar som strömmas till en fjärrvärd.

Loggfiler skapade av json-file föraren lagras under /var/lib/docker/containers katalog. Varje container får sin egen loggfil som används under hela dess livstid. Det finns ingen loggrotation konfigurerad som standard.

Att bara ta bort loggfilen är inte en effektiv lösning. Docker förväntar sig att filen ska vara tillgänglig kontinuerligt och kommer inte att återskapa den automatiskt om den tas bort. Det är säkrare att klar den befintliga loggens innehåll för att undvika att påverka aktuella skrivningar.

Upptäcker loggfilens väg

Hitta först sökvägen till din målbehållares loggfil. Du kan hämta loggfilens sökväg för en behållare som heter my-app genom att köra följande kommando:

$ docker inspect --format="{{.LogPath}}" my-app
/var/lib/containers/1380d936...-json.log

Rensa loggfilen

Du kan rensa ut innehållet i loggen utan att ta bort den genom att eka en tom sträng i dess innehåll. Filen kommer att ägas av root så du måste utföra denna operation i ett rotskal. Följande kommando tömmer loggfilen åt dig:

$ sudo sh -c 'echo "" > $(docker inspect --format="{{.LogPath}}" my-app)'

Skalinterpolering används för att dynamiskt hämta loggfilens sökväg för my-app behållare. Du kan manuellt ersätta sökvägen som hämtades tidigare istället.

När du springer docker logs my-appkommer du nu att se tom utdata om inte behållaren har återupptagit skrivning av rader under tiden.

Begränsa loggutdata

De docker logs kommandot accepterar några argument som kan användas för att begränsa utdata från bullriga loggar. Dessa hjälper till att minska behovet av att rengöra loggen samtidigt som de förhindrar att din terminal översvämmas av gamla rader varje gång du kommer åt filen.

  • --tail – Den här flaggan instruerar Docker att bara sända ut ett visst antal gamla loggrader, med början med den senaste.
  • --until och --since – Dessa flaggor begränsar utmatningen till logglinjer som sänds ut under en viss tidsperiod. De är användbara när du vet den ungefärliga tidsramen inom vilken en händelse inträffade.

Här är några exempel:

Visa de 100 senaste loggraderna

docker logs my-app --tail 100

Visa loggrader skrivna under den senaste timmen

docker logs my-app --since 1h

Visa upp till 100 loggrader skrivna under den senaste timmen

docker logs my-app --tail 100 --since 1h

Ställa in loggrotation

Att regelbundet behöva rensa loggfiler på detta sätt signalerar vanligtvis att din applikations loggar antingen är överdrivet omfattande eller att det helt enkelt finns för mycket aktivitet att lagra i en fil.

Många Docker-loggningsdrivrutiner, inklusive json-filehar valfritt stöd för loggrotation som du kan aktivera globalt för Docker-demonen eller per behållare.

Daemon-inställningar konfigureras i /etc/docker/daemon.json. Här är ett exempel som roterar containerloggar när de når 8 MB. Upp till fem filer kommer att behållas när som helst, och gamla raderas automatiskt när nya rotationer sker.

{
    "log-opts": {
        "max-size": "8m",
        "max-file": "5"
    }
}

Starta om Docker-demonen för att tillämpa ändringen:

$ sudo service docker restart

Rotation på Daemonnivå gäller alla nyskapade behållare. Ändringar påverkar inte några behållare som redan finns på din värd.

Rotation kan konfigureras för individuella behållare med hjälp av --log-opts flaggor. Dessa kommer att åsidosätta dina standardinställningar för Docker-demonen.

docker run --name app 
    --log-driver json-file 
    --log-opts max-size=8M 
    --log-opts max-file=5 
    app-image:latest

Sammanfattning

Docker-containerloggar kan bli bullriga när upptagna applikationer skriver omfattande utdata. Tillgång till utförliga loggar är till hjälp för felsökning men de konsumerar lagringsutrymme, gör det svårare att sålla igenom data och kan minska prestandan.

Du kan rensa loggfiler på begäran genom att använda skalkommandon för att tömma deras innehåll. Det är dock bättre att ställa in loggrotation så att detta sker automatiskt när filer når en viss storlek. De docker logs kommandot stöder också flaggor som kan hjälpa till att tämja otympliga loggar vid åtkomstpunkten.



[ad_2]

Leave a Reply

Your email address will not be published.