Top 10 Docker logging gotchas elke Docker gebruiker moet weten

een van de eerste commando ‘ s Docker gebruikers leren na “docker run” is “docker logs” — maar wist je dat de “docker logs” commando niet altijd werkt? Dat klinkt misschien geweldig, maar het is waar. We zullen later meer te weten komen over de redenen.

Docker veranderde niet alleen de manier waarop toepassingen worden geïmplementeerd, maar ook de workflow voor logbeheer. In plaats van het schrijven van logs naar bestanden, containers schrijven logs naar de console (stdout/stderr) en Docker Logging Drivers doorsturen logs naar hun bestemming. Een controle tegen Docker GitHub problemen snel laat zien dat gebruikers verschillende problemen hebben bij het omgaan met Docker logs.

Docker Logging Drivers overzicht

het beheren van logs met Docker lijkt lastig en heeft meer kennis nodig van Docker Logging Driver implementaties en alternatieven om problemen die mensen melden op te lossen. Dus wat zijn de top 10 Docker logging Gotcha ‘ s, elke Docker gebruiker moet weten?

laten we beginnen met een overzicht van Docker Logging Drivers en opties om logs te verzenden naar gecentraliseerde Log Management oplossingen zoals Elastic Stack (voormalige ELK Stack) of Sematext Cloud.

in de vroege dagen van Docker, container logs waren alleen beschikbaar via Docker remote API, dat wil zeggen via “docker logs” commando en een paar geavanceerde log verladers. Later introduceerde Docker logging drivers als plugins, om Docker te openen voor integraties met verschillende log management tools. Deze logging drivers worden geà mplementeerd als binaire plugins in de docker daemon. Onlangs, de plugin architectuur werd uitgebreid tot logging plugins draaien als externe processen, die kon registreren als plugins en logs op te halen via Linux FIFO-bestanden. Momenteel, logging drivers geleverd met docker binaries zijn binaire plugins, maar dit kan veranderen in de nabije toekomst.

Docker – Logboekstuurprogramma ‘ s ontvangen containerlogboeken en sturen deze door naar externe bestemmingen of bestanden. Het standaard logboekstuurprogramma is “json-file”. Het slaat container logs in JSON-formaat op lokale schijf. Docker heeft een plug-in architectuur voor het loggen van stuurprogramma ‘ s, zo zijn er plugins voor open source tools en commerciële tools beschikbaar:

  • Journald – opslag container logt in het systeem journal
  • Syslog-Driver – ondersteuning van UDP, TCP, TLS
  • Fluentd – ondersteuning van de TCP-of Unix socket verbindingen naar fluentd
  • Splunk – HTTP/HTTPS doorsturen naar Splunk server
  • Gelf – UDP log doorsturen naar Graylog2

Voor een compleet log bestand management oplossing, extra hulpmiddelen dienen te worden betrokken:

  • Log-parser om logs te structureren, typisch een deel van log-verladers (fluentd, rsyslog, logstash, logagent, …)
  • log-indexering, visualisatie en alarmering:
    • Elasticsearch en Kibana (Elastisch Stapel, ook wel bekend als ELANDEN stapel),
    • Splunk,
    • Logentries,
    • Loggly,
    • Sumologic,
    • Graylog OSS / Enterprise
    • Sematext Cloud / Enterprise
    • en nog veel meer …

Om het schip van de logs naar een van de backends moet je misschien selecteer een log-stuurprogramma of logging tool ondersteunt uw Log Management oplossing. Als uw gereedschap Syslog-invoer nodig heeft, kunt u het syslog-stuurprogramma kiezen.

1.Docker logs commando werkt alleen met JSON-file Logging driver

het standaard Logging driver ” json-file “schrijft logs naar de lokale schijf, en het JSON-file driver is de enige die parallel werkt aan” docker logs ” Commando. Zodra men gebruik maakt van alternatieve loggen stuurprogramma ‘ s, zoals Syslog, Gelf of Splunk, het Koppelvenster logs API-aanroepen start niet, en de “dokwerker logs” opdracht een fout melden van de beperkingen in plaats van het weergeven van de logs op de console. Niet alleen is de Docker log commando mislukt, maar veel andere tools met behulp van de Docker API voor logs, zoals Docker user interfaces zoals Portainer of log collection containers zoals Logspout zijn niet in staat om de container logs te tonen in deze situatie.

zie dit nummer.

Docker Syslog-stuurprogramma kan containerimplementatie blokkeren en logs verliezen wanneer de Syslog-server niet bereikbaar is

het Docker Syslog-stuurprogramma met TCP of TLS is een betrouwbare manier om logs te leveren. Het syslog-logboekstuurprogramma vereist echter een gevestigde TCP-verbinding met de Syslog-server wanneer een container opstart. Als deze verbinding niet tot stand kan worden gebracht tijdens het begin van de container, mislukt de start van de container met een foutmelding zoals

docker: Error response from daemon: Failed to initializate logging driver: dial tcp

dit betekent dat een tijdelijk netwerkprobleem of hoge netwerk latency de implementatie van containers kan blokkeren. Daarnaast kan een herstart van de Syslog-server alle containers die via TCP/TS loggen afbreken naar een centrale Syslog-server, wat zeker de situatie is om te vermijden.

zie dit nummer.

3. Docker syslog driver verliest logs wanneer de bestemming is down

vergelijkbaar met het probleem hierboven, waardoor een verlies van logs is de ontbrekende mogelijkheid van Docker logging drivers om logs te bufferen op de schijf wanneer ze niet kunnen worden geleverd aan externe bestemmingen. Hier is een interessante kwestie om naar te kijken.

4. Docker logging drivers ondersteunen geen multi-line logs zoals error stack traces

als we het hebben over logs, denken de meeste mensen aan eenvoudige single-line logs, bijvoorbeeld Nginx of Apache logs. Logs kunnen echter ook meerdere regels overspannen. Bijvoorbeeld, exception traces overspannen meestal meerdere regels, dus om Logstash gebruikers te helpen hebben we gedeeld hoe stack traces met Logstash af te handelen.

dingen zijn niet beter in de wereld van containers, waar dingen nog ingewikkelder omdat logs van alle apps die in containers worden uitgezonden naar dezelfde output-stdout. Geen wonder te zien kwestie # 22920 gesloten met ” gesloten. Kan me niet schelen.”zo veel mensen teleurgesteld. Gelukkig zijn er tools zoals Sematext Docker Agent die multi-line logs uit de doos kan ontleden, evenals aangepaste multi-line patronen toepassen.

Docker service logs Commando hangt met niet – JSON logging driver

terwijl de JSON-files driver lijkt robuust, andere log drivers kunnen helaas nog steeds problemen veroorzaken met Docker Swarm mode. Zie dit GitHub probleem.

Docker-daemon crasht als de vloeiende daemon weg is en de buffer vol is

een ander scenario waarin een logboekstuurprogramma problemen veroorzaakt wanneer de externe bestemming niet bereikbaar is — in dit specifieke geval gooit de logboekstuurprogramma ‘ s uitzonderingen die de Docker-daemon doen crashen.

Docker container komt vast te zitten in aangemaakte toestand bij Splunk driver failure

als de Splunk server een 504 retourneert bij het starten van de container, wordt de container daadwerkelijk gestart, maar docker meldt dat de container niet is gestart. Eenmaal in deze toestand verschijnt de container niet meer onder docker ps en kan het containerproces niet worden gestopt met docker kill. De enige manier om het proces te stoppen is door het handmatig te doden.

zie dit nummer.

Docker logs overslaan / ontbrekende applicatielogs (journald driver)

het blijkt dat dit probleem wordt veroorzaakt door journald rate limits, die moet worden verhoogd als Docker logs maakt voor alle draaiende applicaties en journald zou sommige logs kunnen overslaan vanwege de snelheidsbeperking instellingen. Dus wees je bewust van uw journald instellingen wanneer u Docker aan te sluiten op het.

problemen met Gelf-stuurprogramma

het gelf-logboekstuurprogramma mist een TCP-of TLS-optie en ondersteunt alleen UDP, wat riskant kan zijn om logberichten te verliezen wanneer UDP-pakketten worden verwijderd. Sommige problemen melden een probleem van DNS-resolutie / caching met GELF stuurprogramma ‘ s, zodat u logs kunnen worden verzonden naar “Nirvana” wanneer uw Graylog server IP verandert — en dit kan snel gebeuren met behulp van container implementaties.

Docker ondersteunt geen meerdere logdrivers

het zou leuk zijn om logs lokaal op de server te hebben opgeslagen en de mogelijkheid om ze naar externe servers te verzenden. Momenteel ondersteunt Docker geen meerdere logstuurprogramma ‘ s, dus gebruikers worden gedwongen om één logstuurprogramma te kiezen. Niet een gemakkelijke beslissing te weten verschillende kwesties vermeld in dit bericht.

dat is het! Dit zijn mijn top 10 Docker Logging Gotcha ‘ s!

zie ook: Continuous Delivery with Jenkins & Docker Security: de voors, tegens en een status update

alternatieven voor Docker Log Drivers

met zoveel problemen rond Docker Log Drivers, zijn er alternatieven? Het blijkt dat er-Docker API gebaseerde log verladers aan de redding!om te redden.

hier zijn een paar goede redenen om naar dergelijke alternatieven te kijken:

  1. Json-file driver is de standaard en betrouwbaar, een lokale kopie van logs is altijd beschikbaar, en de’ docker logs ‘ en Docker API aanroepen voor logs gewoon werken.
  2. mogelijkheid om logs te filteren op verschillende dynamische criteria zoals afbeeldingsnaam of labels
  3. betere metagegevens, volledige toegang tot Docker API
  4. geen risico van crashen Docker Daemon omdat dergelijke log verladers kunnen draaien in een container met beperkt gebruik van bronnen en schijfruimte (bijv. buffermap in een volume plaatsen en nuttige limieten instellen)

laten we eens kijken naar twee aanbevolen Docker API gebaseerde log collection tools: Logspout en Sematext Docker Agent. Beide zijn open source.

een derde tool, die min of meer in deze categorie past, is Elastic Filebeat. Filebeat verzamelt logbestanden van, gegenereerd door de JSON-file log driver alleen de verrijking voor container metadata wordt gedaan via Docker API calls.

Logspout biedt meerdere uitgangen en kan logboeken van verschillende containers naar verschillende bestemmingen routeren zonder de instellingen voor het logboekregistreren van applicatiecontainers te wijzigen. Het behandelt ANSI Escape sequences (zoals kleurcodes in logs), wat problematisch kan zijn voor full-text zoeken in Elasticsearch.

net als Logspout, Sematext Docker Agent (SDA) is API gebaseerd, ondersteunt log routing en behandelt ANSI Escape sequences voor full-text search. Echter, Sematext Docker Agent is eigenlijk meer dan alleen een eenvoudige log verzender.

SDA zorgt voor veel problemen die door Docker-gebruikers, zoals multi-line logs, log format detectie en log parsing, complete metadata verrijking containers (labels, geoip, Swarm en Kubernetes specifieke metadata), schijf buffering en betrouwbare verzending via TLS. Het is open source op Github, kan worden gebruikt met de Elastic Stack of Sematext Cloud en kan niet alleen container logs verzamelen, maar ook container gebeurtenissen, plus Docker host en container metrics.

verschillen tussen drie logging oplossingen die goed werken met de JSON-file driver en Docker Remote API

aanbeveling

de duidelijke aanbeveling voor API-gebaseerde loggers kan in de toekomst veranderen als Docker log drivers verbeteren in de tijd en het nieuwe plugin mechanisme via Unix socket laat nieuwe logging driver implementaties draaien als afzonderlijke processen. Deze functie verbetert echt Dockers logging plugin architectuur en is een goed teken dat Docker logging problemen serieus neemt.

in de tussentijd, overweeg Docker API gebaseerde log verzamelaars zoals Sematext Docker Agent en Logspout om te voorkomen dat in problemen met Docker logs, zoals de 10 Gotcha ‘ s hier beschreven.

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.