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.
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 -