🚀 Nuova versione beta disponibile! Feedback o problemi? Contattaci

Logging con Morgan: Monitorare le Richieste HTTP in Express.js

Codegrind TeamAug 28 2024

Morgan è un middleware di logging per Express.js che semplifica il processo di monitoraggio delle richieste HTTP. È uno strumento essenziale per lo sviluppo e la manutenzione di applicazioni Node.js, in quanto permette di tracciare e registrare dettagli delle richieste in arrivo, come il metodo HTTP, l’URL, il codice di stato, e il tempo di risposta. In questa guida, esploreremo come integrare Morgan in un’applicazione Express, i diversi formati di logging che offre, e le best practices per utilizzare Morgan in produzione.

Cos’è Morgan?

Morgan è un middleware che registra le richieste HTTP fatte all’applicazione Express. È particolarmente utile durante lo sviluppo e il debugging, poiché fornisce una visione chiara delle richieste che l’applicazione sta gestendo e delle loro risposte. Morgan è altamente configurabile, consentendo di scegliere diversi formati di logging e di registrare i log su file o su console.

Caratteristiche Principali di Morgan

  • Semplice da Usare: Integrarlo in un’applicazione Express è facile e veloce.
  • Configurabile: Supporta vari formati di logging, dalla modalità predefinita al logging personalizzato.
  • Logging Condizionale: Può essere configurato per registrare solo determinati tipi di richieste.
  • Compatibilità: Funziona perfettamente con altri middleware e strumenti di Express.

Installazione di Morgan

Per utilizzare Morgan, prima devi installarlo nel tuo progetto Node.js. Esegui il seguente comando nel terminale all’interno della cartella del progetto:

npm install morgan --save

Questo comando aggiungerà Morgan come dipendenza nel tuo progetto, registrandolo nel file package.json.

Configurazione di Base di Morgan

Dopo aver installato Morgan, è possibile integrarlo nel file principale della tua applicazione Express, solitamente app.js o server.js.

1. Integrazione di Morgan

Apri il file app.js e aggiungi il seguente codice per configurare Morgan:

const express = require("express");
const morgan = require("morgan");
const app = express();

// Configura Morgan per il logging delle richieste
app.use(morgan("dev"));

app.get("/", (req, res) => {
  res.send("Benvenuto su Express con Morgan!");
});

const port = 3000;
app.listen(port, () => {
  console.log(`Server in ascolto su http://localhost:${port}`);
});

2. Avvio del Server

Esegui il server con il comando:

node app.js

Ora, ogni volta che effettui una richiesta al server, Morgan loggherà i dettagli della richiesta nella console. Ad esempio, effettuando una richiesta GET a http://localhost:3000/, vedrai un log simile a questo:

GET / 200 6.100 ms - 25

Questo log indica il metodo HTTP (GET), l’URL richiesto (/), il codice di stato della risposta (200), il tempo impiegato per servire la richiesta (6.100 ms), e la dimensione della risposta (25 byte).

Formati di Logging Disponibili

Morgan supporta diversi formati di logging predefiniti che puoi utilizzare a seconda delle tue esigenze. Alcuni dei formati più comuni sono:

1. dev

Il formato dev è pensato per l’ambiente di sviluppo. È semplice e colorato, fornendo una rapida panoramica delle richieste HTTP.

app.use(morgan("dev"));

2. common

Il formato common è simile ai log dei server Apache. Mostra informazioni standard come l’indirizzo IP del client, la data della richiesta, il metodo HTTP, l’URL, il codice di stato e la dimensione della risposta.

app.use(morgan("common"));

3. combined

Il formato combined è ancora più dettagliato rispetto a common. Oltre alle informazioni di common, include il referer e l’user-agent del client.

app.use(morgan("combined"));

4. short

Il formato short è una versione compatta del formato common, che include meno dettagli, utile quando si vogliono log più brevi.

app.use(morgan("short"));

5. tiny

Il formato tiny è il più minimale di tutti, registrando solo il metodo HTTP, l’URL, il codice di stato e il tempo di risposta.

app.use(morgan("tiny"));

Log su File

Oltre a loggare le richieste sulla console, puoi configurare Morgan per scrivere i log su file. Questo è particolarmente utile in ambienti di produzione, dove i log devono essere conservati e analizzati successivamente.

Esempio di Log su File

Prima di tutto, installa il modulo fs (file system) di Node.js se non lo hai già:

const fs = require("fs");
const path = require("path");
const morgan = require("morgan");

const app = express();

// Configura Morgan per scrivere i log su un file
const accessLogStream = fs.createWriteStream(
  path.join(__dirname, "access.log"),
  { flags: "a" }
);
app.use(morgan("combined", { stream: accessLogStream }));

app.get("/", (req, res) => {
  res.send("Benvenuto su Express con logging su file!");
});

app.listen(3000, () => {
  console.log("Server in ascolto sulla porta 3000");
});

In questo esempio, Morgan scriverà i log in un file chiamato access.log nella cartella principale del progetto. Ogni richiesta al server verrà registrata in questo file.

Logging Condizionale

Morgan permette anche di eseguire il logging condizionale, cioè loggare solo determinate richieste in base a specifici criteri.

Esempio di Logging Condizionale

Supponiamo di voler loggare solo le richieste che producono un errore (codice di stato 4xx o 5xx):

app.use(
  morgan("combined", {
    skip: (req, res) => res.statusCode < 400,
  })
);

In questo esempio, Morgan registrerà solo le richieste che restituiscono un codice di stato pari o superiore a 400, ignorando le altre.

Best Practices per l’Uso di Morgan

1. Diversificare i Log tra Sviluppo e Produzione

Utilizza formati di log diversi a seconda dell’ambiente. Ad esempio, usa dev in sviluppo per log rapidi e colorati, e combined in produzione per log completi e dettagliati.

2. Limitare la Dimensione dei File di Log

Assicurati di gestire la dimensione dei file di log in produzione. Puoi configurare la rotazione dei log utilizzando moduli come rotating-file-stream.

3. Monitorare i Log

Integra Morgan con strumenti di monitoraggio e analisi dei log come ELK stack (Elasticsearch, Logstash, Kibana) o servizi come Papertrail e Loggly per analizzare i log in modo efficiente.

4. Loggare le Richieste di Errore

Configura Morgan per assicurarti che tutte le richieste che generano errori vengano loggate, facilitando il debugging e la risoluzione dei problemi.

Conclusione

Morgan è uno strumento potente e flessibile per il logging delle richieste HTTP in Express.js. Che tu stia sviluppando una semplice applicazione o un’API complessa, Morgan ti aiuterà a monitorare l’attività del server e a identificare rapidamente eventuali problemi. Con le sue numerose opzioni di configurazione e supporto per vari formati di log, Morgan può essere adattato facilmente alle esigenze specifiche del tuo progetto. Integralo oggi nella tua applicazione Express per migliorare il monitoraggio e la manutenzione.