Logo de Béjean Développement

Archiver vos logs Magento 2 avec Logrotate

Objectif

Archiver vos logs et gagner de l'espace disque en archivant vos logs Magento 2.

Pré-requis

Dans cet article, nous verrons uniquement la mise en place d'un conteneur Logrotate sous Docker pour archiver vos logs. Pour suivre le tutoriel, vous aurez besoin d'une boutique Magento 2 exécutée dans un environnement Docker.

Tutoriel

Création du projet

Arborescence

Commençons par créer un dossier dans lequel nous allons travailler :

mkdir m2-logrotate && cd m2-logrotate

Dans ce dossier, nous allons créer les dossiers pour les volumes persistants de notre conteneur Docker :

mkdir -p conf/logrotate bin/logrotate

Fichier de configuration

Dans le dossier conf/logrotate, nous allons créer un fichier magento de configuration pour traiter tous les fichiers de log du dossier var/log.

Voici le contenu du chaque fichier :

/var/log/magento/cron.log
/var/log/magento/debug.log
/var/log/magento/exception.log
/var/log/magento/system.log
{
    rotate 6
    compress
    nodelaycompress
    missingok
    notifempty
}

Pour sécuriser la génération des logs, je recommande de lister les fichiers concernés.

On précise que l'on souhaite une permutation de 6 fois rotate avant la suppression.

La compression gzip est activée grâce au paramètre compress. De plus la compression se fait dès la première rotation en utilisant le paramètre nodelaycompress.

L'avant-dernier paramètre missingok permet de ne pas générer d'erreurs dans le cas où un journal est manquant.

Le dernier paramètre notifempty ne permute pas le journal si, il est vide.

Si vous souhaitez plus d'informations sur la configuration, je vous invite à consulter le man, en lançant la commande man logrotate.

Fichier de script

Créons le fichier de script cronstart dans le dossier bin/logrotate. Ce fichier sera lancé dès que le conteneur sera lancé.

#!/bin/bash

# Lance le service cron
service cron start

# Permet de laisser le conteneur up
tail -f /dev/null

Fichier : logrotate.Dockerfile

Pour lancer le conteneur de Logrotate, nous allons nous baser sur une image Docker debian:buster-slim. Insérez le contenu ci-dessous dans le fichier logrotate.Dockerfile. Le fichier doit être créé à la racine du projet.

FROM debian:buster-slim

# Met à jour les dépôts et installe logrotate et cron
RUN apt-get update && apt-get install -y logrotate cron

# Copie le fichier de configuration dans le conteneur
COPY ./conf/logrotate/magento /etc/logrotate.d/magento

# Crée le fichier de cron
RUN touch /etc/cron.d/magento
RUN echo "0 0 * * * /usr/sbin/logrotate -f /etc/logrotate.d/magento" >> /etc/cron.d/magento
RUN echo "\n" >> /etc/cron.d/magento

# Donne la propriété du fichier à root sur le fichier de configuration
RUN chown -R root /etc/cron.d/magento

# Modification des droits sur le fichier de configuration
RUN chmod -R 0644 /etc/cron.d/magento

# Active le fichier dans le crontab
RUN crontab /etc/cron.d/magento

# Copie le fichier de script dans le conteneur
COPY ./bin/logrotate/cronstart /usr/local/bin/

# Donne les droits d'exécution au fichier
RUN chmod +x /usr/local/bin/cronstart

L'archivage des journaux est planifiée tous les jours à 00 h 00. Je vous invite à ajouter le paramètre à votre convenance.

Fichier : docker-compose.yml

Terminons en créant le fichier docker-compose.yml à la racine de notre projet (dossier m2-logrotate). Le contenu est le suivant :

version: '3'
services:
  logstash:
    build:
      context: ../magento
      dockerfile: logrotate.Dockerfile
    volumes:
      - ./racine_de_magento/var/log:/var/log/magento

networks:
  myNetwork:
    driver: bridge

Configuration de Logstash

Magento 2 génère ses logs dans le dossier var/log, nous allons donc configurer Logstash pour qu'il consulte en permanence ce dossier.

Pour cela, il faut que les logs de Magento soit accessible par la machine hôte. Dans mon cas, je lance Magento 2 avec Docker, lien vers le tutoriel.

Mise en place du volume persistant

Une fois que les fichiers de logs sont accessibles sur la machine hôte, il faut mettre en place un volume persistant à notre conteneur logstash avec les 2 lignes ci-dessous :

volumes:
  - ./racine_de_magento/var/log:/var/log/magento

Les 2 lignes sont à ajouter au fichier docker-compose.yml, le résultat est le suivant :

version: '3'
services:
  logrotate:
    build:
      context: .
      dockerfile: logrotate.Dockerfile
    command: /usr/local/bin/cronstart
    volumes:
      - ./racine_de_magento/var/log:/var/log/magento
    networks:
      - myNetwork

networks:
  myNetwork:
    driver: bridge

N'oubliez pas de remplacer racine_de_magento.

Enregistrer et fermer le fichier. Puis lancer la commande :

docker-compose build && docker-compose up -d

Résultat

Pour contrôler que les journaux soient bien archivés, il faut utiliser 2 méthodes, la première consiste à lancer le job du cron manuellement avec la commande :

docker exec -it m2-logrotate_logrotate_1 /usr/sbin/logrotate -f /etc/logrotate.d/magento

La valeur m2-logrotate_logrotate_1 doit correspondre à votre conteneur Docker.

En lançant cette commande, vous devriez avoir des fichiers .gz dans votre dossier var/log.

Ensuite, il faut attendre que les crons se lancent, pour éviter d'attendre, je vous invite à modifier la récurrence de la tâche cron.