Building for Production: Webanwendungen - Zentralisierte Protokollierung

Einführung

Jetzt können wir die zentrale Protokollierung für die Einrichtung unserer Produktionsanwendung einrichten. Die zentrale Protokollierung ist eine hervorragende Möglichkeit, die Protokolle Ihrer Server zu erfassen und zu visualisieren. Im Allgemeinen ist das Einrichten eines ausgeklügelten Protokollierungssystems nicht so wichtig wie das Einrichten solider Sicherungen und Überwachungen, aber es kann sehr nützlich sein, wenn Sie versuchen, Trends oder Probleme mit Ihrer Anwendung zu identifizieren.

In diesem Lernprogramm richten wir einen ELK-Stack (Elasticsearch, Logstash und Kibana) ein und konfigurieren die Server, aus denen unsere Anwendung besteht, so, dass ihre relevanten Protokolle an den Protokollierungsserver gesendet werden. Wir werden auch Logstash filters einrichten, um unsere Protokolle zu analysieren und zu strukturieren und so eine einfache Suche zu ermöglichen und filtern Sie sie und verwenden Sie sie in Kibana-Visualisierungen.

Voraussetzungen

Wenn Sie über einen Domainnamen auf Ihr Protokollierungs-Dashboard zugreifen möchten, erstellen Sie unter Ihrer Domain einen * A-Eintrag *, z. B. "logging.example.com", der auf die öffentliche IP-Adresse Ihres * Protokollierungs-Servers * verweist. Alternativ können Sie über die öffentliche IP-Adresse auf das Überwachungs-Dashboard zugreifen. Es wird empfohlen, den Protokollierungswebserver für die Verwendung von HTTPS einzurichten und den Zugriff darauf zu beschränken, indem Sie ihn hinter einem VPN platzieren.

Installieren Sie ELK auf dem Protokollierungsserver

Richten Sie ELK auf Ihrem * Protokollierungs * -Server ein, indem Sie diesem Tutorial folgen: https://www.digitalocean.com/community/tutorials/how-to-install-elasticsearch-logstash-and-kibana-4-on-ubuntu-14- 04 [So installieren Sie Elasticsearch, Logstash und Kibana 4 unter Ubuntu 14.04].

Wenn Sie ein privates DNS für die Namensauflösung verwenden, befolgen Sie unbedingt * Option 2 * unter https://www.digitalocean.com/community/tutorials/how-to-install-elasticsearch-logstash-and-kibana-4 -on-ubuntu-14-04 # ssl-Zertifikate generieren [Abschnitt SSL-Zertifikate generieren].

Stoppen Sie, wenn Sie den Abschnitt * Logstash Forwarder einrichten * erreichen.

Richten Sie Logstash Forwarder auf Clients ein

Richten Sie Logstash Forwarder, einen Protokollversender, auf Ihren Client-Servern ein, z. db1, app1, app2 und lb1 finden Sie unter https://www.digitalocean.com/community/tutorials/how-to-install-elasticsearch-logstash-and-kibana-4-on-ubuntu-14-04# set-up-logstash-forwarder- (Client-Server hinzufügen) [Abschnitt Logstash-Forwarder einrichten] des ELK-Tutorials.

Wenn Sie fertig sind, sollten Sie in der Lage sein, sich über die öffentliche Netzwerkadresse des * Protokollierungsservers * bei Kibana anzumelden und die Syslogs aller Ihrer Server anzuzeigen.

Identifizieren Sie die zu sammelnden Protokolle

Abhängig von Ihrer genauen Anwendung und Einrichtung stehen verschiedene Protokolle zur Verfügung, die in Ihrem ELK-Stack gesammelt werden können. In unserem Fall sammeln wir die folgenden Protokolle:

  • Langsame MySQL-Abfrageprotokolle (db1)

  • Apache-Zugriffs- und Fehlerprotokolle (App1 und App2)

  • HAProxy-Protokolle (lb1)

Wir haben diese Protokolle ausgewählt, weil sie nützliche Informationen für die Fehlerbehebung oder das Erkennen von Trends liefern können. Ihre Server verfügen möglicherweise über andere Protokolle, die Sie sammeln möchten. Dies erleichtert Ihnen jedoch den Einstieg.

Richten Sie MySQL-Protokolle ein

Das langsame MySQL-Abfrageprotokoll befindet sich normalerweise unter "+ / var / log / mysql / mysql-slow". Es besteht aus Protokollen, die so lange ausgeführt werden, dass sie als "langsame Abfragen" gelten. Durch das Identifizieren dieser Abfragen können Sie Ihre Anwendung optimieren oder Probleme beheben.

Aktivieren Sie das MySQL Slow Query Log

Das Protokoll für langsame Abfragen ist standardmäßig nicht aktiviert. Lassen Sie uns MySQL so konfigurieren, dass diese Abfragetypen protokolliert werden.

Öffnen Sie Ihre MySQL-Konfigurationsdatei:

sudo vi /etc/mysql/my.cnf

Suchen Sie die kommentierte Zeile "logslowqueries" und kommentieren Sie sie aus, damit sie so aussieht:

/etc/mysql/my.cnf

log_slow_queries        = /var/log/mysql/mysql-slow.log

Speichern und schließen.

Wir müssen MySQL neu starten, damit die Änderung wirksam wird:

sudo service mysql restart

Jetzt protokolliert MySQL seine lang laufenden Abfragen in der in der Konfiguration angegebenen Protokolldatei.

Versenden Sie MySQL-Protokolldateien

Wir müssen Logstash Forwarder so konfigurieren, dass das langsame MySQL-Abfrageprotokoll an unseren Protokollierungsserver gesendet wird.

Öffnen Sie auf Ihrem Datenbankserver, db1, die Konfigurationsdatei von Logstash Forwarder:

sudo vi /etc/logstash-forwarder.conf

Fügen Sie im Abschnitt "Dateien" unter den vorhandenen Einträgen Folgendes hinzu, um die langsamen MySQL-Abfrageprotokolle als Typ "mysql-slow" an Ihren Logstash-Server zu senden:

logstash-forwarder.conf - Langsame MySQL-Abfrage

,
   {
     "paths": [
       "/var/log/mysql/mysql-slow.log"
      ],
     "fields": { "type": "mysql-slow" }
   }

Speichern und schließen. Dadurch wird Logstash Forwarder so konfiguriert, dass die langsamen MySQL-Abfrageprotokolle gesendet und als Protokolle vom Typ "mysql-slow" markiert werden, die später zum Filtern verwendet werden.

Starten Sie Logstash Forwarder neu, um die Protokolle zu versenden:

sudo service logstash-forwarder restart

Multiline Input Codec

Das langsame MySQL-Abfrageprotokoll hat ein mehrzeiliges Format (d. H. Da sich jeder Eintrag über mehrere Zeilen erstreckt, müssen wir den mehrzeiligen Codec von Logstash aktivieren, um diesen Protokolltyp verarbeiten zu können.

Öffnen Sie auf dem ELK-Server * logging * die Konfigurationsdatei, in der Ihre Lumberjack-Eingabe definiert ist:

sudo vi /etc/logstash/conf.d/01-lumberjack-input.conf

Fügen Sie in der Eingabedefinition "+ Holzfäller +" die folgenden Zeilen hinzu:

   codec => multiline {
     pattern => "^# User@Host:"
     negate => true
     what => previous
   }

Speichern und schließen. Dadurch wird Logstash so konfiguriert, dass der mehrzeilige Protokollprozessor verwendet wird, wenn Protokolle gefunden werden, die das angegebene Muster enthalten (d. H. beginnt mit "# User @ Host:").

Als nächstes richten wir den Logstash-Filter für die MySQL-Protokolle ein.

MySQL-Protokollfilter

Öffnen Sie auf dem ELK-Server * logging * eine neue Datei, um unsere MySQL-Protokollfilter zu Logstash hinzuzufügen. Wir werden es "+ 11-mysql.conf " nennen, damit es nach der Logstash-Eingabekonfiguration gelesen wird (in der Datei " 01-lumberjack-input.conf +"):

sudo vi /etc/logstash/conf.d/11-mysql.conf

Fügen Sie die folgende Filterdefinition hinzu:

11-mysql.conf

filter {
 # Capture user, optional host and optional ip fields
 # sample log file lines:
 if [type] == "mysql-slow" {
   grok {
     match => [ "message", "^# User@Host: %{USER:user}(?:\[[^\]]+\])?\s+@\s+%{HOST:host}?\s+\[%{IP:ip}?\]" ]
   }
   # Capture query time, lock time, rows returned and rows examined
   grok {
     match => [ "message", "^# Query_time: %{NUMBER:duration:float}\s+Lock_time: %{NUMBER:lock_wait:float} Rows_sent: %{NUMBER:results:int} \s*Rows_examined: %{NUMBER:scanned:int}"]
   }
   # Capture the time the query happened
   grok {
     match => [ "message", "^SET timestamp=%{NUMBER:timestamp};" ]
   }
   # Extract the time based on the time of the query and not the time the item got logged
   date {
     match => [ "timestamp", "UNIX" ]
   }
   # Drop the captured timestamp field since it has been moved to the time of the event
   mutate {
     remove_field => "timestamp"
   }
 }
}

Speichern und schließen. Dadurch wird Logstash so konfiguriert, dass Protokolle vom Typ "+ mysql-slow " mit den in den Direktiven " match " angegebenen Grok-Mustern gefiltert werden. Die Protokolle vom Typ " Apache-Zugriff " werden von dem von Logstash bereitgestellten Grok-Muster analysiert, das dem Standardformat für Apache-Protokollnachrichten entspricht, während die Protokolle vom Typ " Apache-Fehler +" von einem Grok-Filter analysiert werden, der entsprechend geschrieben wurde das Standard-Fehlerprotokollformat.

Starten Sie Logstash neu, damit diese Filter funktionieren:

sudo service logstash restart

An dieser Stelle sollten Sie sicherstellen, dass Logstash ordnungsgemäß ausgeführt wird, da Konfigurationsfehler dazu führen, dass es fehlschlägt.

Sie möchten auch bestätigen, dass Kibana die gefilterten Apache-Protokolle anzeigen kann.

Apache-Protokolle

Die Protokolle von Apache befinden sich normalerweise in "+ / var / log / apache2 +" mit den Namen "access.log" und "error.log". Wenn Sie diese Protokolle zusammenstellen, können Sie zusätzlich zu den von Apache gemeldeten Fehlermeldungen die IP-Adressen derjenigen überprüfen, die auf Ihre Server zugreifen, welche Anforderungen sie haben und welche Betriebssysteme und Webbrowser sie verwenden.

Versenden Sie Apache-Protokolldateien

Wir müssen Logstash Forwarder so konfigurieren, dass die Apache-Zugriffs- und Fehlerprotokolle an unseren Protokollierungsserver gesendet werden.

Öffnen Sie auf Ihren Anwendungsservern app1 und app2 die Konfigurationsdatei von Logstash Forwarder:

sudo vi /etc/logstash-forwarder.conf

Fügen Sie im Abschnitt "Dateien" unter den vorhandenen Einträgen Folgendes hinzu, um die Apache-Protokolle als entsprechende Typen an Ihren Logstash-Server zu senden:

logstash-forwarder.conf - Apache-Zugriffs- und Fehlerprotokolle

,
   {
     "paths": [
       "/var/log/apache2/access.log"
      ],
     "fields": { "type": "apache-access" }
   },
   {
     "paths": [
       "/var/log/apache2/error.log"
      ],
     "fields": { "type": "apache-error" }
   }

Speichern und schließen. Dadurch wird Logstash Forwarder so konfiguriert, dass die Apache-Zugriffs- und Fehlerprotokolle gesendet und als ihre jeweiligen Typen markiert werden, die zum Filtern der Protokolle verwendet werden.

Starten Sie Logstash Forwarder neu, um die Protokolle zu versenden:

sudo service logstash-forwarder restart

Derzeit haben alle Ihre Apache-Protokolle eine Client-Quell-IP-Adresse, die mit der privaten IP-Adresse des HAProxy-Servers übereinstimmt, da der HAProxy-Reverse-Proxy der einzige Weg ist, über das Internet auf Ihre Anwendungsserver zuzugreifen. Um dies zu ändern, um die Quell-IP des tatsächlichen Benutzers anzuzeigen, der auf Ihre Site zugreift, können wir das Standard-Apache-Protokollformat so ändern, dass die von HAProxy gesendeten Header + X-Forwarded-For + verwendet werden.

Öffnen Sie Ihre Apache-Konfigurationsdatei (apache2.conf):

sudo vi /etc/apache2/apache2.conf

Suchen Sie die Zeile, die so aussieht:

[Label apache2.conf - Original "combined" LogFormat]
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined

Ersetzen Sie *% h * durch *% \ {X-Forwarded-For} i *, damit es so aussieht:

[Label apache2.conf - Updated "combined" LogFormat]
LogFormat " %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined

Speichern und schließen. Dadurch wird das Apache-Zugriffsprotokoll so konfiguriert, dass die Quell-IP-Adresse Ihrer tatsächlichen Benutzer anstelle der privaten IP-Adresse des HAProxy-Servers enthalten ist.

Starten Sie Apache neu, damit die Protokolländerung wirksam wird:

sudo service apache2 restart

Jetzt können wir Logstash Apache-Protokollfilter hinzufügen.

Apache-Protokollfilter

Öffnen Sie auf dem ELK-Server * logging * eine neue Datei, um unsere Apache-Protokollfilter zu Logstash hinzuzufügen. Wir werden es "+ 12-apache.conf " nennen, damit es nach der Logstash-Eingabekonfiguration (in der Datei " 01-lumberjack-input.conf +") gelesen wird:

sudo vi /etc/logstash/conf.d/12-apache.conf

Fügen Sie die folgenden Filterdefinitionen hinzu:

12-apache.conf

filter {
 if [type] == "apache-access" {
   grok {
     match => { "message" => "%{COMBINEDAPACHELOG}" }
   }
 }
}
filter {
 if [type] == "apache-error" {
   grok {
     match => { "message" => "\[(?<timestamp>%{DAY:day} %{MONTH:month} %{MONTHDAY} %{TIME} %{YEAR})\] \[%{DATA:severity}\] \[pid %{NUMBER:pid}\] \[client %{IPORHOST:clientip}:%{POSINT:clientport}] %{GREEDYDATA:error_message}" }
   }
 }
}

Speichern und schließen. Hiermit wird Logstash so konfiguriert, dass Protokolle vom Typ "+ Apache-Zugriff " und " Apache-Fehler" mit den in den jeweiligen Direktiven "+ match " angegebenen Grok-Mustern gefiltert werden. Die Protokolle vom Typ " Apache-Zugriff " werden von dem von Logstash bereitgestellten Grok-Muster analysiert, das dem Standardformat für Apache-Protokollnachrichten entspricht, während die Protokolle vom Typ " Apache-Fehler +" von einem Grok-Filter analysiert werden, der entsprechend geschrieben wurde das Standard-Fehlerprotokollformat.

Starten Sie Logstash neu, damit diese Filter funktionieren:

sudo service logstash restart

An dieser Stelle sollten Sie sicherstellen, dass Logstash ordnungsgemäß ausgeführt wird, da Konfigurationsfehler dazu führen, dass es fehlschlägt. Sie möchten auch bestätigen, dass Kibana die gefilterten Apache-Protokolle anzeigen kann.

HAProxy-Protokolle

Die Protokolle von HAProxy befinden sich normalerweise in + / var / log / haproxy.log +. Wenn Sie diese Protokolle zusammenstellen, können Sie die IP-Adressen derjenigen überprüfen, die auf Ihren Load Balancer zugreifen, welche Anforderungen sie haben, welche Anwendungsserver ihre Anforderungen bearbeiten und verschiedene andere Details zur Verbindung.

Versenden Sie die HAProxy-Protokolldateien

Wir müssen Logstash Forwarder konfigurieren, um die HAProxy-Protokolle zu versenden.

Öffnen Sie auf Ihrem HAProxy-Server * lb1 * die Konfigurationsdatei von Logstash Forwarder:

sudo vi /etc/logstash-forwarder.conf

Fügen Sie im Abschnitt "Dateien" unter den vorhandenen Einträgen Folgendes hinzu, um die HAProxy-Protokolle als Typ "haproxy-log" an Ihren Logstash-Server zu senden:

logstash-forwarder.conf - HAProxy-Protokolle

,
   {
     "paths": [
       "/var/log/haproxy.log"
      ],
     "fields": { "type": "haproxy-log" }
   }

Speichern und schließen. Hiermit wird Logstash Forwarder so konfiguriert, dass die HAProxy-Protokolle versendet und als "+ haproxy-log +" markiert werden, das zum Filtern der Protokolle verwendet wird.

Starten Sie Logstash Forwarder neu, um die Protokolle zu versenden:

sudo service logstash-forwarder restart

HAProxy-Protokollfilter

Öffnen Sie auf dem ELK-Server * logging * eine neue Datei, um unseren HAProxy-Protokollfilter zu Logstash hinzuzufügen. Wir werden es + 13-haproxy.conf + nennen, so dass es nach der Logstash-Eingabekonfiguration gelesen wird (in der + 01-lumberjack-input.conf + Datei):

sudo vi /etc/logstash/conf.d/13-haproxy.conf

Fügen Sie die folgende Filterdefinition hinzu:

filter {
 if [type] == "haproxy-log" {
   grok {
     match => { "message" => "%{SYSLOGTIMESTAMP:timestamp} %{HOSTNAME:hostname} %{SYSLOGPROG}: %{IPORHOST:clientip}:%{POSINT:clientport} \[%{MONTHDAY}[./-]%{MONTH}[./-]%{YEAR}:%{TIME}\] %{NOTSPACE:frontend_name} %{NOTSPACE:backend_name}/%{NOTSPACE:server_name} %{INT:time_request}/%{INT:time_queue}/%{INT:time_backend_connect}/%{INT:time_backend_response}/%{NOTSPACE:time_duration} %{INT:http_status_code} %{NOTSPACE:bytes_read} %{DATA:captured_request_cookie} %{DATA:captured_response_cookie} %{NOTSPACE:termination_state} %{INT:actconn}/%{INT:feconn}/%{INT:beconn}/%{INT:srvconn}/%{NOTSPACE:retries} %{INT:srv_queue}/%{INT:backend_queue} "(%{WORD:http_verb} %{URIPATHPARAM:http_request} HTTP/%{NUMBER:http_version})|<BADREQ>|(%{WORD:http_verb} (%{URIPROTO:http_proto}://))" }
   }
 }
}

Speichern und schließen. Hiermit wird Logstash so konfiguriert, dass Protokolle vom Typ "+ haproxy-log " mit den in der jeweiligen Direktive " match " angegebenen Grok-Mustern gefiltert werden. Die Protokolle vom Typ " haproxy-log +" werden von dem von Logstash bereitgestellten Grok-Muster analysiert, das dem Standardformat für HAProxy-Protokollnachrichten entspricht.

Starten Sie Logstash neu, damit diese Filter funktionieren:

sudo service logstash restart

An dieser Stelle sollten Sie sicherstellen, dass Logstash ordnungsgemäß ausgeführt wird, da Konfigurationsfehler dazu führen, dass es fehlschlägt.

Richten Sie Kibana-Visualisierungen ein

Nachdem Sie Ihre Protokolle an einem zentralen Ort gesammelt haben, können Sie sie mit Kibana visualisieren. Dieses Tutorial kann Ihnen den Einstieg erleichtern: How To Use Kibana Dashboards and Visualizations.

Probieren Sie dieses Tutorial aus, um Ihre Benutzer auf interessante Weise zu visualisieren, sobald Sie mit Kibana vertraut sind: https://www.digitalocean.com/community/tutorials/how-to-map-user-location-with-geoip-and -elk-elasticsearch-logstash-and-kibana [So kartieren Sie den Benutzerstandort mit GeoIP und ELK].

Fazit

Herzliche Glückwünsche! Sie haben die Lernprogrammreihe zum Einrichten der Produktionswebanwendung abgeschlossen. Wenn Sie alle Tutorials befolgt haben, sollten Sie ein Setup haben, das wie im Übersichts-Tutorial beschrieben aussieht (mit privatem DNS und Remote-Backups):

Das heißt, Sie sollten eine funktionierende Anwendung mit entkoppelten Komponenten haben, die durch Sicherungen, Überwachung und zentralisierte Protokollierungskomponenten unterstützt wird. Testen Sie unbedingt Ihre Anwendung und stellen Sie sicher, dass alle Komponenten wie erwartet funktionieren.