Skip to main content
Express uses the debug module internally to log information about route matches, middleware functions, application mode, and the request-response cycle.

Using the Debug Module

The debug module allows you to selectively enable debug output by setting the DEBUG environment variable.

View All Internal Logs

To see all internal logs used in Express, set the DEBUG environment variable to express:*:
DEBUG=express:* node app.js

Filter Debug Output

You can filter debug output to specific modules:
# Only router logs
DEBUG=express:router node app.js

# Router and application logs
DEBUG=express:router,express:application node app.js

# All express logs plus your app logs
DEBUG=express:*,myapp:* node app.js

Adding Debug to Your App

1

Install debug module

The debug module comes with Express, but you can also install it separately:
npm install debug
2

Create debug instances

Create debug instances for different parts of your application:
const debug = require('debug')('myapp:server');
const dbDebug = require('debug')('myapp:database');

debug('Server starting on port 3000');
dbDebug('Connected to database');
3

Run with debug enabled

Enable your debug output:
DEBUG=myapp:* node app.js

Example Debug Integration

const express = require('express');
const debug = require('debug')('myapp:server');
const dbDebug = require('debug')('myapp:db');

const app = express();

app.use((req, res, next) => {
  debug('%s %s', req.method, req.url);
  next();
});

app.get('/users', async (req, res) => {
  dbDebug('Fetching users from database');
  // ... database query
  res.json(users);
});

const port = 3000;
app.listen(port, () => {
  debug('Server listening on port %d', port);
});

Node.js Inspector

Use the built-in Node.js debugger for advanced debugging with breakpoints and step-through execution.

Start with Inspector

node --inspect app.js
Then open Chrome and navigate to chrome://inspect to connect to your app.

Debugging with VS Code

Create a .vscode/launch.json file:
{
  "version": "0.2.0",
  "configurations": [
    {
      "type": "node",
      "request": "launch",
      "name": "Debug Express App",
      "program": "${workspaceFolder}/app.js",
      "env": {
        "DEBUG": "express:*,myapp:*"
      }
    }
  ]
}

Logging Middleware

Use Morgan for HTTP request logging:
const morgan = require('morgan');

// Use 'dev' format in development
if (app.get('env') === 'development') {
  app.use(morgan('dev'));
}

// Use 'combined' format in production
if (app.get('env') === 'production') {
  app.use(morgan('combined'));
}
Avoid logging sensitive data like passwords, tokens, or personal information.

Debug Patterns

const debug = require('debug')('myapp:middleware');

app.use((req, res, next) => {
  debug('Middleware executed for %s', req.url);
  next();
});
const debug = require('debug')('myapp:routes');

app.get('/api/data', (req, res) => {
  debug('Fetching data for user %s', req.user?.id);
  // ... handler code
});
const debug = require('debug')('myapp:error');

app.use((err, req, res, next) => {
  debug('Error occurred: %s', err.message);
  debug('Stack: %s', err.stack);
  // ... error handling
});

Best Practices

  • Use descriptive namespace patterns like app:module:submodule
  • Disable debug output in production unless troubleshooting
  • Use different debug instances for different components
  • Combine debug with proper error handling
  • Use Morgan for HTTP request logging

Build docs developers (and LLMs) love