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

Tutorial zur Docker-Installation in einer Linux-Umgebung

1. Installationsumgebung Docker unterstützt die f...

So erhalten Sie die dynamische Anzahl der verbleibenden Wörter im Textbereich

Ich bin bei der Arbeit auf einen Fall gestoßen, ü...

Lösung für das Timeout-Problem der SNMP4J-Serververbindung

Als Verwaltungszentrale und Server dient dabei un...

Detaillierte Analyse des MySQL 8.0-Speicherverbrauchs

Inhaltsverzeichnis 1. innodb_buffer_pool_size 2. ...

Wichtige Punkte zum Schreiben von Inhalten für META-Tags in HTML-Webseiten

Das META-Tag ist ein Hilfstag im Kopfbereich der ...

Javascript-Grundlagen zu integrierten Objekten

Inhaltsverzeichnis 1. Einführung in integrierte O...

MySQL5.6.31 winx64.zip Installations- und Konfigurationstutorial

#1. Herunterladen # #2. Entpacken Sie die Datei l...

Drei Möglichkeiten zum Sperren und Entsperren von Benutzerkonten in Linux

Wenn in Ihrer Organisation bereits eine Kennwortr...

Implementierung der Elementzeitleiste

Inhaltsverzeichnis Komponenten - Zeitleiste Benut...

Drei Möglichkeiten zum Konfigurieren einer JNDI-Datenquelle in Tomcat

In meiner früheren Arbeit war der Entwicklungsser...

Javascript verwendet das Integritätsattribut zur Sicherheitsüberprüfung

Inhaltsverzeichnis 1. Dateien mit Skript-Tags imp...