Voici le tutoriel "Logging et Monitoring Express" en respectant les instructions fournies :
Pourquoi Logging et Monitoring Express ?
Contexte réel : pourquoi un dev a besoin de ca au quotidien
En tant que développeur, vous êtes probablement familiarisé avec les problèmes courants liés à l'application web, comme des erreurs imprévues, des performances lentes ou une utilisation élevée de la mémoire. Logging et monitoring permettent d'identifier ces problèmes et de les résoudre rapidement.
Un cas d'utilisation concret en 2-3 phrases
Imaginons un service de gestion de tâches en ligne. Si vous ne suivez pas les erreurs et les performances de votre application, vous pourriez tomber sur des situations où certaines tâches ne sont pas traitées correctement ou que l'interface utilisateur est lente pour les utilisateurs. Logging permet de capturer ces événements pour les analyser, tandis que monitoring vous donne une vue d'ensemble en temps réel de la santé de votre application.
Prerequis
Connaissances nécessaires
- Connaissance de base de Node.js et Express
- Compréhension des concepts de middleware et de gestion des erreurs
- Familiarité avec les outils de ligne de commande comme
npm
Outils à installer (versions)
- Node.js v14 ou plus tard
- npm 6.0.0 ou plus tard
Concepts fondamentaux
Logging
Logging est le processus d'enregistrement des événements qui se produisent pendant l'exécution de votre application. Cela peut inclure des informations sur les requêtes entrantes, les erreurs et les performances.
Schema mental :

// Importer la bibliothèque express
const express = require('express');
const app = express();
// Middleware de logging personnalisé
app.use((req, res, next) => {
console.log(`Requête ${req.method} sur ${req.url}`);
next();
});
// Route d'exemple
app.get('/', (req, res) => {
res.send('Bonjour');
});
// Démarrer le serveur
app.listen(3000, () => {
console.log('Serveur démarré sur http://localhost:3000');
});
Monitoring
Monitoring permet de surveiller les performances et la santé de votre application en temps réel. Cela peut inclure des métriques comme le taux d'erreurs, la latence des requêtes et l'utilisation de la CPU.
Schema mental :

// Importer les bibliothèques nécessaires
const express = require('express');
const app = express();
const morgan = require('morgan');
const http = require('http');
// Middleware de logging avec Morgan
app.use(morgan('combined'));
// Route d'exemple
app.get('/', (req, res) => {
res.send('Bonjour');
});
// Démarrer le serveur
const server = app.listen(3000, () => {
console.log('Serveur démarré sur http://localhost:3000');
});
// Utiliser l'API HTTP pour surveiller les performances
http.get('http://localhost:3000', (res) => {
res.on('data', (chunk) => {
console.log(`Réponse du serveur : ${chunk}`);
});
}).on('error', (err) => {
console.error(`Erreur de connexion : ${err.message}`);
});
Mise en pratique : projet fil rouge
Construisons un gestionnaire de tâches basique
Étape 1 : Initialiser le projet
mkdir task-manager
cd task-manager
npm init -y
npm install express morgan body-parser
Étape 2 : Structure des fichiers
Créez les fichiers suivants :
app.js.env(pour stocker les variables d'environnement)
Étape 3 : Code complet
// app.js
const express = require('express');
const morgan = require('morgan');
const bodyParser = require('body-parser');
const app = express();
const port = process.env.PORT || 3000;
// Middleware de logging avec Morgan
app.use(morgan('combined'));
// Middleware pour parser le corps des requêtes JSON
app.use(bodyParser.json());
// Stockage simulé pour les tâches
let tasks = [];
// Route pour obtenir toutes les tâches
app.get('/tasks', (req, res) => {
res.json(tasks);
});
// Route pour ajouter une nouvelle tâche
app.post('/tasks', (req, res) => {
const task = req.body;
tasks.push(task);
res.status(201).json(task);
});
// Route pour mettre à jour une tâche existante
app.put('/tasks/:id', (req, res) => {
const id = parseInt(req.params.id);
const updatedTask = req.body;
if (id >= 0 && id < tasks.length) {
tasks[id] = { ...tasks[id], ...updatedTask };
res.json(tasks[id]);
} else {
res.status(404).json({ message: 'Tâche non trouvée' });
}
});
// Route pour supprimer une tâche
app.delete('/tasks/:id', (req, res) => {
const id = parseInt(req.params.id);
if (id >= 0 && id < tasks.length) {
tasks.splice(id, 1);
res.status(204).send();
} else {
res.status(404).json({ message: 'Tâche non trouvée' });
}
});
// Démarrer le serveur
app.listen(port, () => {
console.log(`Serveur démarré sur http://localhost:${port}`);
});
Étape 4 : Lancer l'application
node app.js
Erreurs fréquentes et debugging
1. Erreur de logging incorrecte
Code incorrect
app.use((req, res, next) => {
console.log(`Requête ${req.method} sur ${res.url}`);
next();
});
Correction
app.use((req, res, next) => {
console.log(`Requête ${req.method} sur ${req.url}`);
next();
});
2. Erreur de monitoring
Code incorrect
http.get('http://localhost:3000', (res) => {
res.on('data', (chunk) => {
console.log(`Réponse du serveur : ${chunk}`);
});
}).on('error', (err) => {
console.error(`Erreur de connexion : ${err.message}`);
});
Correction
http.get('http://localhost:3000', (res) => {
res.on('data', (chunk) => {
console.log(`Réponse du serveur : ${chunk}`);
});
}).on('error', (err) => {
console.error(`Erreur de connexion : ${err.message}`);
});
3. Erreur d'ajout de tâche
Code incorrect
app.post('/tasks', (req, res) => {
const task = req.body;
tasks.push(task);
res.status(201).json(task);
});
Correction
app.post('/tasks', (req, res) => {
const task = req.body;
tasks.push(task);
res.status(201).json(task);
});
Pour aller plus loin
1. Utilisation de Winston pour le logging
Winston est une bibliothèque populaire pour le logging en Node.js.
Documentation : Winston
2. Intégration avec Prometheus et Grafana
Prometheus et Grafana sont des outils populaires pour le monitoring de systèmes distribués.
Documentation :
3. Utilisation de Sentry pour le monitoring des erreurs
Sentry est une plateforme de gestion des erreurs et de surveillance.
Documentation : Sentry
Défi pratique
Créez un simple API REST avec Express qui permet de gérer des utilisateurs (ajouter, récupérer, mettre à jour, supprimer). Assurez-vous d'avoir les points suivants :
- Logging pour toutes les requêtes
- Monitoring des performances
- Gestion des erreurs