Detaillierte Erläuterung der Protokollverarbeitung von Docker-Containern

Detaillierte Erläuterung der Protokollverarbeitung von Docker-Containern

Docker verfügt über viele Log-Plugins. Standardmäßig wird JSON-File verwendet. Nur wenn JSON-File verwendet wird, kann sudo docker logs -f angezeigt werden. Geben Sie den folgenden Befehl ein, um das Docker-Log-Plugin anzuzeigen:

$ sudo docker info | grep Protokollierung

Lassen Sie mich hier erklären, dass Docker beim Ausführen des Containers eine mit dem Container verknüpfte Datei auf dem Hostcomputer erstellt und dann die vom Container generierten Protokolle in diese Datei überträgt. Der Befehl „Docker Logs -f“ findet den Inhalt der Datei und zeigt ihn auf dem Terminal an.

Wir alle wissen, dass Docker Logs -f alle entsprechenden Dienstprotokolle an das Terminal ausgibt, unabhängig davon, auf welchem ​​Knoten der Dienst bereitgestellt wird. Jetzt habe ich also eine Frage: Speichert die Containerdatei, die jedem Knoten entspricht, die vollständige Protokollsicherung des Dienstes oder werden nur die Protokolle gespeichert, die vom Container generiert werden, der dem Knotendienst entspricht?

Denn dieses Problem besteht darin, dass, wenn jeder Knoten Filebeat verwendet, um die Containerprotokolldatei des Hostcomputers abzuhören, das Protokoll wiederholt wird, wenn das Containerprotokoll jedes Knotens eine vollständige Sicherung ist. Wenn nur das Protokoll des Containers auf dem Knoten gespeichert wird, wird es nicht wiederholt.

Die Antwort besteht darin, nur die Protokolle des Containers auf dem Knoten zu behalten. Der Befehl docker logs -f führt lediglich eine Protokollschicht auf dem Overlay-Netzwerkmodell aus, um dieselben Containerprotokolle auf anderen Knoten zu aggregieren.

Standardmäßig wird die JSON-Datei von Docker verwendet. Konfigurieren Sie zuerst den Daemon:

$ sudo dockerd \
--log-driver=json-datei \
--log-opt labels=Dienstname

Um den Container zu starten, müssen Sie die folgenden Parameter hinzufügen:

$ sudo Docker-Dienst-Update --label Dienstname=test

Oder markieren Sie es direkt in docker-compose.yml:

Version: "3"

Leistungen:
 go-gin-demo:
  Bild: chenghuizhang/go-gin-demo:v3
  Häfen:
   -8081:8081
  Netzwerke:
   - Überlagerung
  einsetzen:
   Modus: repliziert
   Replikate: 3
  Beschriftungen:
   Dienstname: go-gin-demoxxxxxxx
  Protokollierung:
   Optionen:
    Beschriftungen: „Dienstname“

Netzwerke:
 Überlagerung:

Installieren Sie Filebeat auf jedem Knoten und konfigurieren Sie filebeat.yml wie folgt:

Dateibeat.prospectors:
- Typ: Protokoll
  Pfade:
  		# Container-Protokollverzeichnis - /var/lib/docker/containers/*/*.log
   # Da der von Docker verwendete Protokolltreiber eine JSON-Datei ist, ist das gesammelte Protokollformat das JSON-Format. Nachdem es auf true gesetzt wurde, führt Filebeat eine json_decode-Verarbeitung für das Protokoll durch json.keys_under_root: true
  tail_files: wahr
Ausgabe.logstash:
 Gastgeber: ["172.17.10.114:5044"]

Konfigurieren Sie den Index in logstash.conf:

Ausgabe {
 elastische Suche
  Aktion => "Index"
  Hosts => ["172.17.10.114:9200"]
  # Holen Sie sich das Log-Label
  index => "%{attrs.servicename}-%{+JJJJ.MM.tt}"
 }
}

Die Dockerfile-Datei muss die vom Projekt ausgegebenen Protokolle auf stdout und stderr drucken. Andernfalls sammelt der JSON-File-Protokolltreiber die Protokollausgabe im Container nicht. Mit sudo docker logs -f werden die Containerprotokolle nicht im Terminal angezeigt. Der folgende Befehl muss zur Dockerfile hinzugefügt werden:

RUN ln -sf /dev/stdout /xx/xx.log \ # info
	&& ln -sf /dev/stderr /xx/xx.log # Fehler

Oder in der Log4j-Konfigurationsausgabekonsole des Projekts:

<Anhänge>
  <Konsolenname="Konsole" Ziel="SYSTEM_OUT">
    <PatternLayout-Muster="[%d{DEFAULT}]%m"/>
  </Konsole>
</Anhänge>

Wenn das Protokoll den Container-ID-Namen und den Image-Namen aufzeichnen muss, können Sie beim Ausführen des Containers die folgenden Parameter hinzufügen:

--log-opt tag="//" 

Schließlich generiert das JSON-File-Log-Plugin die Protokolle, die der Container im folgenden Format auf der Konsole im lokalen Verzeichnis /var/lib/docker/containers/*/ ausgibt:

{
  "log":"[GIN-debug] [WARNUNG] Derzeit erfordert Gin Go 1.6 oder höher und Go 1.7 wird bald erforderlich sein.",
  "stream":"stderr",
  "Attribute": {
    "Tag":"chenghuizhang/go-gin-demo:v3@sha256:e6c0419d64e5eda510056a38cfb803750e4ac2f0f4862d153f7c4501f576798b/mygo.2.jhqptjugfti2t4emf55sehamo/647eaa4b3913",
    "Dienstname": "Test"
  },
  "Zeit":"2019-01-29T10:08:59.780161908Z"
}

Protokolle in Logstash formatieren:

Filter {
 grok {
  patterns_dir => "/etc/logstash/conf.d/patterns"
  Übereinstimmung => {"Nachricht" => "%{TIMESTAMP_ISO8601:time}%{SERVICENAME:attr.servicename}%{DOCKER_TAG:attr.tag}"}
}

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, er wird für jedermanns Studium hilfreich sein. Ich hoffe auch, dass jeder 123WORDPRESS.COM unterstützen wird.

Das könnte Sie auch interessieren:
  • Implementierung der Änderung von Konfigurationsdateien im Docker-Container
  • Implementieren Sie dynamisches Management und Monitoring von Docker-Containern basierend auf Spring-Boot und Docker-Java [mit vollständigem Quellcode-Download]
  • Zusammenfassung der Methoden zum Erstellen, Auflisten und Löschen von Docker-Containern unter Linux
  • So zeigen Sie Anwendungsprotokolle von Docker-Containern an
  • Detaillierte Erklärung, wie Sie das automatische Beenden des Docker-Containers verhindern können
  • Detaillierte Erläuterung zur Lösung des Problems, dass der Docker-Container nicht über IP auf den Hostcomputer zugreifen kann
  • So verwenden Sie einen Docker-Container für den Zugriff auf das Host-Netzwerk
  • Zusammenfassung und ausführliche Erläuterung der Docker-Container-Bedienungsanleitung

<<:  Der gesamte Prozess der Verwendung von node.js Express zum automatischen Erstellen des Projekts

>>:  So ändern Sie MySQL-Berechtigungen, um Hosts den Zugriff zu ermöglichen

Artikel empfehlen

Details zu verschiedenen Schriftformaten in HTML-Webseiten

Dieser Abschnitt beginnt mit den Details der Text...

Einfaches Beispiel für den Grenzwertparameter der MySQL-Paging

Zwei Parameter der MySQL-Paging Wählen Sie * aus ...

So installieren Sie Babel mit NPM in VSCode

Vorwort Im vorherigen Artikel wurde die Installat...

Detailliertes Tutorial zum Upgrade von Zabbix Monitoring 4.4 auf 5.0

1. Zabbix-Backup [root@iZ2zeapnvuohe8p14289u6Z /]...

Implementierung der Bereitstellung des Nginx+ModSecurity-Sicherheitsmoduls

Inhaltsverzeichnis 1. Herunterladen 2. Bereitstel...

Detaillierte Erklärung des Sandbox-Mechanismus von Vue3

Inhaltsverzeichnis Vorwort Browser kompilierte Ve...

Detaillierte Erläuterung des Watch-Listener-Beispiels in vue3.0

Inhaltsverzeichnis Vorwort Der Unterschied zwisch...

Einführung in den Aufbau eines DNS-Servers unter centos7

Inhaltsverzeichnis 1. Projektumgebung: 2: DNS-Ser...

Tipps zum Erstellen zweidimensionaler Arrays in JavaScript

Erstellen eines zweidimensionalen Arrays in Js: Z...

CSS3 erzielt verschiedene Randeffekte

Durchscheinender Rand Ergebnis: Implementierungsc...

jQuery implementiert verschachtelte Tab-Funktion

In diesem Artikelbeispiel wird der spezifische Co...

Verwendung des Fokus-innerhalb-Selektors von CSS3

Pseudoelemente und Pseudoklassen Apropos, schauen...

So verwenden Sie das Realip-Modul im Nginx-Grundlagenlernen

Vorwort Es gibt zwei Arten von Nginx-Modulen: off...