Building for Production: Applications Web - Journalisation centralisée

introduction

Nous sommes enfin prêts à configurer la journalisation centralisée pour la configuration de nos applications de production. La journalisation centralisée est un excellent moyen de rassembler et de visualiser les journaux de vos serveurs. En règle générale, la configuration d’un système d’enregistrement complexe n’est pas aussi importante que la mise en place de sauvegardes et d’une surveillance solides, mais elle peut s’avérer très utile lorsque vous essayez d’identifier les tendances ou les problèmes liés à votre application.

image: https: //assets.digitalocean.com/articles/architecture/production/centralized_logging.png [Diagramme de journalisation centralisée]

Dans ce didacticiel, nous allons configurer une pile ELK (Elasticsearch, Logstash et Kibana) et configurer les serveurs qui composent notre application pour qu’ils envoient leurs journaux pertinents au serveur de journalisation. Nous allons également mettre en place des filtres Logstash pour analyser et structurer nos journaux, ce qui nous permettra de rechercher facilement filtrez-les et utilisez-les dans les visualisations Kibana.

Conditions préalables

Si vous souhaitez accéder à votre tableau de bord de journalisation via un nom de domaine, créez un * A Record * sous votre domaine, tel que «logging.example.com», qui pointe vers l’adresse IP publique de votre serveur * logging *. Vous pouvez également accéder au tableau de bord de surveillance via l’adresse IP publique. Il est conseillé de configurer le serveur Web de journalisation pour utiliser HTTPS et de limiter son accès en le plaçant derrière un VPN.

Installer ELK sur le serveur de journalisation

Configurez ELK sur votre serveur * de journalisation * en suivant ce tutoriel: https://www.digitalocean.com/community/tutorials/how-to-install-elasticsearch-logstash-and-kibana-4-on-ubuntu-14- 04 [Comment installer Elasticsearch, Logstash et Kibana 4 sur Ubuntu 14.04].

Si vous utilisez un DNS privé pour la résolution de noms, veillez à suivre * Option 2 * dans la page https://www.digitalocean.com/community/tutorials/how-to-install-elasticsearch-logstash-and-kibana-4. -on-ubuntu-14-04 # generate-ssl-certificates [Section Générer des certificats SSL].

Arrêtez-vous lorsque vous atteignez la section * Configurer le gestionnaire Logstash Forwarder *.

Configurer le redirecteur Logstash sur les clients

Configurez Logstash Forwarder, un expéditeur de journaux, sur vos serveurs clients, c.-à-d. db1, app1, app2 et lb1, en suivant les https://www.digitalocean.com/community/tutorials/how-to-install-elasticsearch-logstash-and-kibana-4-on-ubuntu-14-04# set-up-logstash-forwarder- (add-client-servers) [Section Configuration du redirecteur Logstash], du didacticiel ELK.

Une fois que vous avez terminé, vous devriez pouvoir vous connecter à Kibana via l’adresse réseau publique du serveur * logging * et consulter les syslogs de chacun de vos serveurs.

Identifier les journaux à collecter

En fonction de votre application et de votre configuration, différents journaux seront disponibles pour être collectés dans votre pile ELK. Dans notre cas, nous allons collecter les logs suivants:

  • Journaux de requêtes lentes MySQL (db1)

  • Historique des accès et des erreurs Apache (app1 et app2)

  • Journaux HAProxy (lb1)

Nous avons choisi ces journaux car ils peuvent fournir des informations utiles lors du dépannage ou de la tentative d’identification de tendances. Vos serveurs peuvent avoir d’autres journaux que vous souhaitez collecter, mais cela vous aidera à démarrer.

Configurer les journaux MySQL

Le journal des requêtes lentes de MySQL se trouve généralement dans + / var / log / mysql / mysql-slow. Elle consiste en des journaux dont l’exécution prend suffisamment de temps pour être considérés comme des «requêtes lentes». Par conséquent, l’identification de ces requêtes peut vous aider à optimiser ou à dépanner votre application.

Activer le journal de requête lent de MySQL

Le journal de requête lent n’est pas activé par défaut, nous allons donc configurer MySQL pour enregistrer ces types de requêtes.

Ouvrez votre fichier de configuration MySQL:

sudo vi /etc/mysql/my.cnf

Recherchez la ligne «logslowqueries» commentée et décommentez-la afin qu’elle ressemble à ceci:

/etc/mysql/my.cnf

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

Sauvegarder et quitter.

Nous devons redémarrer MySQL pour que le changement prenne effet:

sudo service mysql restart

Maintenant, MySQL enregistrera ses longues requêtes dans le fichier journal spécifié dans la configuration.

Expédier les fichiers de log MySQL

Nous devons configurer Logstash Forwarder pour qu’il envoie le journal de requête lente MySQL à notre serveur de journalisation.

Sur votre serveur de base de données, db1, ouvrez le fichier de configuration Logstash Forwarder:

sudo vi /etc/logstash-forwarder.conf

Ajoutez ce qui suit, dans la section «fichiers» sous les entrées existantes, pour envoyer les journaux de requêtes lentes MySQL de type «mysql-slow» à votre serveur Logstash:

logstash-forwarder.conf - Requête lente MySQL

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

Sauvegarder et quitter. Ceci configure Logstash Forwarder pour qu’il envoie les journaux de requêtes lentes MySQL et les marque comme des journaux de type «mysql-slow», qui seront utilisés ultérieurement pour le filtrage.

Redémarrez Logstash Forwarder pour commencer à expédier les journaux:

sudo service logstash-forwarder restart

Codec d’entrée multiligne

Le journal de requête lente de MySQL est dans un format multiligne (c.-à-d. chaque entrée s’étend sur plusieurs lignes), nous devons donc permettre au codec multiligne de Logstash de pouvoir traiter ce type de journal.

Sur le serveur ELK, * logging *, ouvrez le fichier de configuration où votre entrée Lumberjack est définie:

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

Dans la définition d’entrée + lumberjack +, ajoutez ces lignes:

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

Sauvegarder et quitter. Ceci configure Logstash pour utiliser le processeur de journaux multiligne lorsqu’il rencontre des journaux contenant le modèle spécifié (c’est-à-dire commence par “# User @ Host:”).

Ensuite, nous allons configurer le filtre Logstash pour les journaux MySQL.

Filtre de journal MySQL

Sur le serveur ELK, * logging *, ouvrez un nouveau fichier pour ajouter nos filtres de journal MySQL à Logstash. Nous l’appellerons + 11-mysql.conf +, il sera donc lu après la configuration d’entrée de Logstash (dans le fichier + 01-lumberjack-input.conf +):

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

Ajoutez la définition de filtre suivante:

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"
   }
 }
}

Sauvegarder et quitter. Ceci configure Logstash pour filtrer les journaux de type mysql-slow + avec les patterns Grok spécifiés dans les directives match +. Les journaux de type + apache-access + sont analysés par le modèle Grok fourni par Logstash qui correspond au format de message de journal Apache par défaut, tandis que les journaux de type + apache-error + sont analysés par un filtre Grok écrit pour correspondre à le format du journal des erreurs par défaut.

Pour que ces filtres fonctionnent, relançons Logstash:

sudo service logstash restart

À ce stade, vous souhaiterez vous assurer que Logstash fonctionne correctement, car des erreurs de configuration provoqueront son échec.

image: https: //assets.digitalocean.com/articles/architecture/production/lamp/kibana.png [Tableau de bord Kibana]

Vous voudrez également vérifier que Kibana est capable de visualiser les journaux filtrés Apache.

Journaux Apache

Les journaux d’Apache sont généralement situés dans + / var / log / apache2 +, nommés “access.log” et “error.log”. La collecte de ces journaux vous permettra de déterminer les adresses IP des utilisateurs qui accèdent à vos serveurs, de ce qu’ils demandent, ainsi que du système d’exploitation et des navigateurs Web qu’ils utilisent, en plus des messages d’erreur signalés par Apache.

Expédier les fichiers journaux Apache

Nous devons configurer Logstash Forwarder pour qu’il envoie les journaux des accès et des erreurs Apache à notre serveur de journalisation.

Sur vos serveurs d’applications, app1 et app2, ouvrez le fichier de configuration de Logstash Forwarder:

sudo vi /etc/logstash-forwarder.conf

Ajoutez ce qui suit dans la section «fichiers» sous les entrées existantes pour envoyer les journaux Apache, en tant que types appropriés, à votre serveur Logstash:

logstash-forwarder.conf - Accès à Apache et journaux des erreurs

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

Sauvegarder et quitter. Ceci configure Logstash Forwarder pour qu’il envoie les journaux des accès et des erreurs Apache et les marque comme leurs types respectifs, qui seront utilisés pour filtrer les journaux.

Redémarrez Logstash Forwarder pour commencer à expédier les journaux:

sudo service logstash-forwarder restart

À l’heure actuelle, tous vos journaux Apache auront une adresse IP source du client qui correspond à l’adresse IP privée du serveur HAProxy, car le proxy inverse HAProxy est le seul moyen d’accéder à vos serveurs d’applications depuis Internet. Pour changer ceci afin d’afficher l’adresse IP source de l’utilisateur réel accédant à votre site, nous pouvons modifier le format de journal Apache par défaut afin qu’il utilise les en-têtes + X-Forwarded-For + envoyés par HAProxy.

Ouvrez votre fichier de configuration Apache (apache2.conf):

sudo vi /etc/apache2/apache2.conf

Trouvez la ligne qui ressemble à ceci:

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

Remplacez *% h * par *% \ {X-Forwarded-For} i *, afin qu’il ressemble à ceci:

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

Sauvegarder et quitter. Ceci configure le journal d’accès Apache de manière à inclure l’adresse IP source de vos utilisateurs réels au lieu de l’adresse IP privée du serveur HAProxy.

Redémarrez Apache pour appliquer le changement de journal:

sudo service apache2 restart

Nous sommes maintenant prêts à ajouter des filtres de journal Apache à Logstash.

Filtres de journal Apache

Sur le serveur ELK, * logging *, ouvrez un nouveau fichier pour ajouter nos filtres de journal Apache à Logstash. Nous l’appellerons + 12-apache.conf +, ainsi il sera lu après la configuration d’entrée de Logstash (dans le fichier + 01-lumberjack-input.conf +):

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

Ajoutez les définitions de filtre suivantes:

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}" }
   }
 }
}

Sauvegarder et quitter. Ceci configure Logstash pour filtrer les journaux de type + apache-access + et + apache-error avec les modèles Grok spécifiés dans les directives` + match + respectives. Les journaux de type `+ apache-access + sont analysés par le modèle Grok fourni par Logstash qui correspond au format de message de journal Apache par défaut, tandis que les journaux de type + apache-error + sont analysés par un filtre Grok écrit pour correspondre à le format du journal des erreurs par défaut.

Pour que ces filtres fonctionnent, relançons Logstash:

sudo service logstash restart

À ce stade, vous souhaiterez vous assurer que Logstash fonctionne correctement, car des erreurs de configuration provoqueront son échec. Vous voudrez également vérifier que Kibana est capable de visualiser les journaux filtrés Apache.

HAProxy Logs

Les journaux de HAProxy sont généralement situés dans + / var / log / haproxy.log +. La collecte de ces journaux vous permettra de déterminer les adresses IP des utilisateurs qui accèdent à votre équilibreur de charge, de ce qu’ils demandent, du serveur d’application répondant à leurs demandes et de divers autres détails relatifs à la connexion.

Expédier les fichiers journaux HAProxy

Nous devons configurer Logstash Forwarder pour envoyer les journaux HAProxy.

Sur votre serveur HAProxy, * lb1 *, ouvrez le fichier de configuration Logstash Forwarder:

sudo vi /etc/logstash-forwarder.conf

Ajoutez ce qui suit dans la section «fichiers» sous les entrées existantes, pour envoyer les journaux HAProxy sous le type «haproxy-log» à votre serveur Logstash:

logstash-forwarder.conf - Journaux HAProxy

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

Sauvegarder et quitter. Ceci configure Logstash Forwarder pour qu’il envoie les journaux HAProxy et les marque comme + haproxy-log +, qui seront utilisés pour filtrer les journaux.

Redémarrez Logstash Forwarder pour commencer à expédier les journaux:

sudo service logstash-forwarder restart

Filtre de journal HAProxy

Sur le serveur ELK, * logging *, ouvrez un nouveau fichier pour ajouter notre filtre de journalisation HAProxy à Logstash. Nous l’appellerons + 13-haproxy.conf +, ainsi il sera lu après la configuration d’entrée de Logstash (dans le fichier + 01-lumberjack-input.conf +):

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

Ajoutez la définition de filtre suivante:

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}://))" }
   }
 }
}

Sauvegarder et quitter. Ceci configure Logstash pour filtrer les journaux de type + haproxy-log + avec les modèles Grok spécifiés dans les directives + match + respectives. Les journaux de type + haproxy-log + sont en cours d’analyse par le modèle Grok fourni par Logstash qui correspond au format de message de journal HAProxy par défaut.

Pour que ces filtres fonctionnent, relançons Logstash:

sudo service logstash restart

À ce stade, vous souhaiterez vous assurer que Logstash fonctionne correctement, car des erreurs de configuration provoqueront son échec.

Configurer les visualisations Kibana

Maintenant que vous collectez vos journaux dans un emplacement central, vous pouvez commencer à utiliser Kibana pour les visualiser. Ce tutoriel peut vous aider à démarrer avec cela: Comment utiliser Kibana Dashboards and Visualizations.

Une fois que vous êtes un peu à l’aise avec Kibana, essayez ce didacticiel pour visualiser vos utilisateurs de manière intéressante: https://www.digitalocean.com/community/tutorials/how-to-map-user-location-with-geoip-and -elk-elasticsearch-logstash-and-kibana [Comment cartographier un emplacement d’utilisateur avec GeoIP et ELK].

Conclusion

Toutes nos félicitations! Vous avez terminé la série de didacticiels Installation d’applications Web de production. Si vous avez suivi tous les tutoriels, vous devriez avoir une configuration qui ressemble à celle décrite dans le tutoriel de présentation (avec DNS privé et sauvegardes à distance):

image: https: //assets.digitalocean.com/articles/architecture/production/lamp/final.png [Configuration de la production]

En d’autres termes, vous devez disposer d’une application opérationnelle, avec des composants découplés, prise en charge par les composants de sauvegarde, de surveillance et de journalisation centralisée. Assurez-vous de tester votre application et assurez-vous que tous les composants fonctionnent comme prévu.