Node.js Logging Best Practices: Essential Guide

Mar 31, 20225 min read

Proper logging is crucial for understanding application behavior, debugging issues, and maintaining production systems. In this guide, we'll explore essential Node.js logging best practices that will help you build more maintainable and debuggable applications.

Why Logging Matters

Good logging practices help you:

  • Debug issues faster
  • Monitor application health
  • Track user behavior
  • Comply with security requirements
  • Understand system performance

Essential Logging Best Practices

1. Use Logging Levels Appropriately

Different situations require different logging levels:

javascript
logger.error("Database connection failed");
logger.warn("API rate limit approaching");
logger.info("User successfully logged in");
logger.debug("Processing request payload");
logger.trace("Entering function processPayment");

2. Include Contextual Information

Always include relevant context in your logs:

javascript
logger.info({
  userId: user.id,
  action: "payment_processed",
  amount: payment.amount,
  timestamp: new Date().toISOString()
});

3. Structured Logging

Use JSON format for structured logging:

javascript
const log = {
  level: "error",
  message: "Payment failed",
  timestamp: new Date().toISOString(),
  transactionId: tx.id,
  error: error.message,
  stack: error.stack
};

4. Use Logging Libraries

Popular logging libraries provide additional features:

  • Winston
  • Bunyan
  • Pino
  • Morgan (for HTTP logging)

Example with Winston:

javascript
const winston = require('winston');

const logger = winston.createLogger({
  level: 'info',
  format: winston.format.json(),
  transports: [
    new winston.transports.File({ filename: 'error.log', level: 'error' }),
    new winston.transports.File({ filename: 'combined.log' })
  ]
});

5. Error Handling and Logging

Always log errors with full stack traces:

javascript
try {
  await processPayment(order);
} catch (error) {
  logger.error({
    message: "Payment processing failed",
    error: error.message,
    stack: error.stack,
    orderId: order.id
  });
}

6. Performance Considerations

  • Use async logging in production
  • Implement log rotation
  • Consider log aggregation services
  • Monitor log sizes

Security Best Practices

1. Sensitive Data

Never log sensitive information:

  • Passwords
  • API keys
  • Personal information
  • Financial data

2. Log Storage

  • Implement proper log rotation
  • Use secure storage
  • Follow retention policies
  • Implement access controls

Production Logging

1. Log Management

Consider using log management services:

  • ELK Stack
  • Splunk
  • Datadog
  • New Relic

2. Monitoring and Alerts

Set up alerts for important events:

  • Critical errors
  • Performance issues
  • Security incidents
  • Business metrics

Conclusion

Implementing proper logging practices is essential for maintaining and debugging Node.js applications. Start with these basics and adapt them to your specific needs. Remember that good logging is a balance between having enough information and maintaining system performance.