#
.
*
#
*
@

NOUS LES DEVS

error log et conteneur docker

Afficher les logs d'une application Wordpress qui tourne sous docker

Niveau : intermédiaire
</> </> </>

Prolog(ue)

Quand je travaille sur un serveur web ou lorsque je configure un vhost sur ma machine, en général il y a toujours un dossier log qui est créé à côté de la racine du site web. Ce dossier contient essentiellement deux fichiers qui m’aident à identifier des erreurs ou à chercher ce qui ne va pas, error_log et access_log.

Lorsqu’il y a un problème au niveau de l’application et même parfois lors de la phase de développement du site web, il m’arrive souvent de me brancher sur l’affichage de ces logs via la commande tail, cela me permet de visualiser les logs en temps réel.

Je vais te montrer comment je fais pour afficher les logs d’un conteneur WordPress qui tourne sous Docker, quelques trucs et astuces, ainsi que le montage d’un volume qui va permettre d’avoir un dossier logs plus facilement accessible.

Un conteneur de base

Voici le docker-compose que j’utilise comme point de départ. Si jamais tu veux partir de cet exemple, tu dois juste modifier le chemin utilisateur et peut-être adapter les ports.

version: '3.1'

services:

  wordpress:
    image: wordpress:php8.1
    restart: always
    ports:
      - 8067:80
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: u-wp
      WORDPRESS_DB_PASSWORD: 123
      WORDPRESS_DB_NAME: db-wp
      WORDPRESS_TABLE_PREFIX: wp_
    volumes:
      - /Users/golendercaria/Docker/wp/SITE/:/var/www/html/
  db:
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_DATABASE: db-wp
      MYSQL_USER: u-wp
      MYSQL_PASSWORD: 123
      MYSQL_RANDOM_ROOT_PASSWORD: '1'
    ports:
      - 33067:3306
    volumes:
      - /Users/golendercaria/Docker/wp/DB/:/var/lib/mysql/

Afficher les logs via une commande

Avec Docker, il y a une commande toute bête pour afficher les logs qui est docker logs. Elle prend des options si besoin et l’identifiant du conteneur.

docker logs [OPTIONS] CONTAINER

Comme pour la commande tail, je peux utiliser l’option -f qui va me permettre de suivre le log en continu. Au final, j’obtiens une commande assez concise.

docker logs -f 4c4b3b0a51ba

Voici un échantillon du log d’un autre conteneur où j’ai déjà un WordPress en place qui contient un thème et des données. J’ai volontairement fait une erreur PHP. Tu peux voir que j’obtiens une fusion de ce que j’aurais obtenu dans error.log et access.log.

[Mon Jun 27 11:14:33.475020 2022] [php7:error] [pid 42] [client 192.168.0.1:61968] PHP Parse error:  syntax error, unexpected ',', expecting end of file in /var/www/html/wp-content/themes/nld/functions.php on line 2, referer: https://localhost:44312/outils/photographies/
192.168.0.1 - - [27/Jun/2022:11:14:33 +0000] "GET /outils/photographies/categorie-11/ HTTP/1.1" 500 3557 "https://localhost:44312/outils/photographies/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:101.0) Gecko/20100101 Firefox/101.0"
[Mon Jun 27 11:22:31.070401 2022] [php7:error] [pid 41] [client 192.168.0.1:61972] PHP Parse error:  syntax error, unexpected ',', expecting end of file in /var/www/html/wp-content/themes/nld/functions.php on line 2, referer: https://localhost:44312/outils/photographies/
192.168.0.1 - - [27/Jun/2022:11:22:30 +0000] "GET /outils/photographies/categorie-11/ HTTP/1.1" 500 4876 "https://localhost:44312/outils/photographies/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:101.0) Gecko/20100101 Firefox/101.0"
192.168.0.1 - - [27/Jun/2022:11:24:44 +0000] "GET /outils/photographies/categorie-11/ HTTP/1.1" 200 11548 "https://localhost:44312/outils/photographies/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:101.0) Gecko/20100101 Firefox/101.0"
192.168.0.1 - - [27/Jun/2022:11:24:44 +0000] "GET /wp-content/themes/nld/css/build/swiper.css?ver=62b9937c5d792 HTTP/1.1" 200 4536 "https://localhost:44312/outils/photographies/categorie-11/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:101.0) Gecko/20100101 Firefox/101.0"

Uniquement error_log

Juste après l’identifiant du conteneur, je vais ajouter « 2>&1 » pour rediriger tout sur le flux de sortie. Ensuite, pour afficher uniquement les erreurs, je vais utiliser un grep (qui permet de filtrer) avec le mot-clé « error ». L’option -i du grep permet l’insensibilité à la casse.

docker logs -f 4c4b3b0a51ba 2>&1 | grep -i error

Le résultat après la mise en place du grep.

[Mon Jun 27 11:11:52.624503 2022] [php7:error] [pid 41] [client 192.168.0.1:61942] PHP Parse error:  syntax error, unexpected ',', expecting end of file in /var/www/html/wp-content/themes/nld/functions.php on line 2, referer: https://localhost:44312/outils/photographies/
[Mon Jun 27 11:13:58.628242 2022] [php7:error] [pid 21] [client 192.168.0.1:61964] PHP Parse error:  syntax error, unexpected ',', expecting end of file in /var/www/html/wp-content/themes/nld/functions.php on line 2, referer: https://localhost:44312/outils/photographies/
[Mon Jun 27 11:14:33.475020 2022] [php7:error] [pid 42] [client 192.168.0.1:61968] PHP Parse error:  syntax error, unexpected ',', expecting end of file in /var/www/html/wp-content/themes/nld/functions.php on line 2, referer: https://localhost:44312/outils/photographies/
[Mon Jun 27 11:22:31.070401 2022] [php7:error] [pid 41] [client 192.168.0.1:61972] PHP Parse error:  syntax error, unexpected ',', expecting end of file in /var/www/html/wp-content/themes/nld/functions.php on line 2, referer: https://localhost:44312/outils/photographies/

Fichier error_log

Même si l’affichage de log reste assez simple, je préfère néanmoins avoir un dossier logs juste à côté de mon code applicatif, ce qui me permet de faire un tail sans avoir à récupérer l’ID du conteneur. La flemmardise poussée à son paroxysme, mais je l’assume.

Pour permettre cela, je crée un dossier LOGS juste à côté de mon dossier SITE et j’ajoute un volume dans mon fichier docker-compose.yml au niveau du service wordpress et je pointe le dossier d’erreur d’apache2.

    volumes:
      - /Users/golendercaria/Docker/wp/SITE/:/var/www/html/
      - /Users/golendercaria/Docker/wp/LOGS/:/var/log/apache2

Après un redémarrage du conteneur, j’observe plusieurs choses. Il n’y a plus de logs dans l’application Docker Desktop ni dans le flux de sortie lorsque j’exécute la commande docker logs. La seconde chose que je remarque, c’est que plusieurs fichiers se sont créés dans le volume que j’ai monté.

-rw-r--r--  1 golendercaria  staff  2855  6 nov 10:57 access.log
-rw-r--r--  1 golendercaria  staff  3956  6 nov 10:57 error.log
-rw-r--r--  1 golendercaria  staff     0  6 nov 08:48 other_vhosts_access.log

À présent je peux lancer un tail sur le fichier error_log sans devoir trouver le nom du conteneur et sans utiliser de grep, c’est beaucoup plus rapide. Je peux même les ouvrir avec un logiciel sur mon poste de travail.

tail -f error.log

Je fais volontairement des erreurs de syntaxe pour voir si cela fonctionne bien et je constate effectivement que la remontée d’erreur s’effectue correctement.

[06-Nov-2022 10:03:59 UTC] PHP Parse error:  syntax error, unexpected token "echo" in /var/www/html/wp-content/themes/nld/index.php on line 4
[06-Nov-2022 10:04:02 UTC] PHP Parse error:  syntax error, unexpected token "echo", expecting variable or "{" or "$" in /var/www/html/wp-content/themes/nld/index.php on line 4

LOGOUT

Voilà, tu sais maintenant configurer ton fichier yml pour obtenir les logs juste à côté des fichiers de ton site. Moi ça me permet d’être plus rapide et d’éviter de chercher l’ID du container docker. J’espère que cette astuce te permettra de gagner du temps.

26/10/2023

Yann Vangampelaere - nouslesdevs -

NOUS LES DEVS

Vous aimez ce que je fais ? Vous voulez que j'en fasse plus ? dans le développement du blog.