Skip to content

Overview

This setup provides a structured, modular approach to logging in a Node.js application. Logs are created on a daily basis with a 90-day retention period, and the middleware captures detailed, contextual activity logs. Both activity and error logs of backend application are dynamically generated to give better insight into application usage and issues.

File Structure

  • logger.js: Configures the main logger with daily rotation and retention for 90 days.
  • loggerMiddleware.js: Captures user activity and error logs, ensuring detailed information about each request.

Logger Configuration

File: logger.js Add the logger.js file to the utils folder.

This file configures Winston to:

  • Generate daily log files named by date.
  • Retain log files for up to 90 days.
  • Compress older log files to save storage space.

Winston and winston-daily-rotate-file is available as a Node.js module and can be installed through the npm registry with the following command:

bash
npm install winston
npm install winston-daily-rotate-file
javascript
const { createLogger, format, transports } = require("winston");
const path = require('path');
const DailyRotateFile = require("winston-daily-rotate-file");

// Custom log format
const customFormat = format.combine(
  format.timestamp({ format: "YYYY-MM-DD HH:mm:ss" }),
  format.align(),
  format.printf((info) => `${info.level}: ${info.timestamp}: ${info.moduleName || 'general'}: ${info.message}`)
);

// Daily rotating file transport with 90-day retention
const dailyRotateTransport = new DailyRotateFile({
  filename: path.resolve(__dirname, '../logs/cms/application-%DATE%.log'), 
  datePattern: "YYYY-MM-DD",
  maxFiles: "90d",
  zippedArchive: true,
  format: customFormat,
});

// Logger instance
const combinedLogger = createLogger({
  level: "info",
  transports: [dailyRotateTransport],
});

// Function to log messages with a module name
function logWithModule(moduleName, level, message) {
  combinedLogger.log({ level, moduleName, message });
}

module.exports = { logWithModule };

Usage

Use logWithModule to log specific actions or errors within your application code, specifying the module, log level, and message.

javascript
const { logWithModule } = require('./logger');

logWithModule('user', 'info', 'User logged in successfully');
logWithModule('product', 'error', 'Failed to add product');

Logger Middleware

File: loggerMiddleware.js Add the logger.js file to the backend/middleware folder.

The loggerMiddleware logs user activity by automatically detecting the HTTP method and dynamically generating messages. It logs user actions (e.g., view, add, edit, delete) based on the request method and user role, and logs request errors in case of failures.

javascript
const { logWithModule } = require('../../utils/logger');  // Adjust path as necessary

// Middleware to log user activity
async function loggerMiddleware(req, res, next) {
  const actionMap = { GET: 'viewed', POST: 'added', PATCH: 'edited', DELETE: 'deleted' };
  const action = actionMap[req.method] || 'performed';
// Capture role and username for dynamic message
  const role = req.session?.user?.role?.name || 'user';
  const userName = req.session?.user?.first_name || 'Unknown';

// Extract context data from request body, query, or path as relevant
  let module =  req.path.split('/').pop();
  const contextData = req.body.name || req.body.title || req.query.name ;

  try {
    res.on('finish', () => {
      const logMessage = `${userName} having ${role} role has ${action} ${contextData ? `the ${contextData} an item on ${module} module` : `${module} module`}`;
      logWithModule('activity', 'info', logMessage);
    });

    next();

  } catch (error) {
    const errorMessage = `Error occurred for ${role} ${userName} on ${req.originalUrl}: ${error.message}`;
    logWithModule('error', 'error', errorMessage);
    next(error);
  }
}

// Error-handling middleware
function errorHandler(err, req, res, next) {
  const role = req.user?.role || 'user';
  const userName = req.user?.name || 'Unknown';
  const errorMessage = `Unhandled error for ${role} ${userName} on ${req.originalUrl}: ${err.message}`;
  logWithModule('error', 'error', errorMessage);
  res.status(500).json({ error: 'Internal Server Error' });
}

module.exports = { loggerMiddleware, errorHandler };

Usage in Express

To use the loggerMiddleware and errorHandler, add them to your Express app:
javascript
const express = require('express');
const { loggerMiddleware, errorHandler } = require('./loggerMiddleware');

const app = express();

app.use(loggerMiddleware);

app.get('/user/profile', (req, res) => {
  res.send('User profile page');
});

app.post('/product', (req, res) => {
  res.send('Product added');
});

app.use(errorHandler);

app.listen(3000, () => {
  console.log('Server running on port 3000');
});

Customization

  • Retention Period: Adjust maxFiles: "90d" in dailyRotateTransport to change the retention period.
  • Log Levels: Modify level in combinedLogger to set a different default log level.
  • Log Directory: Update the filename path to save logs in a different directory.

Example Logs

Here’s what the log files might look like based on the configuration and middleware setup:

javascript
info: 2024-11-11 11:15:24: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:20:47: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:20:47: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:20:47: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:20:47: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:20:48: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:20:48: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:20:48: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:20:49: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:20:49: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:20:50: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:20:50: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:20:50: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:20:51: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:20:51: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:20:51: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:20:52: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:20:52: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:20:52: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:20:53: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:20:53: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:20:54: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:20:54: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:20:55: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:20:55: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:20:55: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:20:56: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:20:56: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:20:56: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:20:57: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:20:57: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:20:58: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:20:58: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:20:58: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:20:59: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:20:59: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:20:59: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:20:59: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:21:00: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:21:00: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:21:00: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:21:06: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:21:06: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:21:06: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:21:07: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:21:07: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:21:07: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:21:08: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:21:08: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:21:08: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:21:08: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:21:09: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:21:09: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:21:09: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:21:10: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:21:10: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:21:11: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:21:11: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:21:12: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:21:12: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:21:12: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:21:43: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:21:44: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:21:44: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:21:44: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:21:45: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:21:45: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:21:45: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:21:46: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:21:46: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:21:46: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:21:47: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:21:48: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:21:48: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:21:48: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:21:49: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:21:49: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:21:49: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:21:50: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:21:50: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:21:51: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:22:52: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:22:52: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:22:52: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:22:52: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:22:53: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:22:53: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:22:53: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:22:54: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:22:54: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:22:54: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:22:55: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:22:55: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:22:55: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:22:55: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:22:56: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:22:56: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:22:56: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:22:57: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:22:57: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:22:58: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:23:52: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:23:52: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:23:53: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:23:53: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:23:53: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:23:53: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:23:54: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:23:54: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:23:54: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:23:55: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:23:55: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:23:55: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:23:56: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:23:56: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:23:57: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:23:58: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:23:58: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:23:59: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:23:59: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:23:59: activity: 	Super Admin having Super Admin role has viewed home module
error: 2024-11-11 11:24:28: error: 	Unhandled error for [object SequelizeInstance:role] Super Admin on /home: /Users/ekbana/ekbana/nihon-ryokou-backend/src/views/backend/layout/base-inner.ejs:14
    12|     <div class="page-body-wrapper horizontal-menu">
    13|         <% include ../partials/sidebar %>
 >> 14|         <%- include(innerPage) %>
    15|         <% include ../partials/footer %>
    16|     </div>
    17|     <% include ../partials/delete-confirm %>

Could not find the include file "../dashboard/hello"
info: 2024-11-11 11:24:28: activity: 	Super Admin having Super Admin role has viewed home module
error: 2024-11-11 11:24:35: error: 	Unhandled error for [object SequelizeInstance:role] Super Admin on /home: /Users/ekbana/ekbana/nihon-ryokou-backend/src/views/backend/layout/base-inner.ejs:14
    12|     <div class="page-body-wrapper horizontal-menu">
    13|         <% include ../partials/sidebar %>
 >> 14|         <%- include(innerPage) %>
    15|         <% include ../partials/footer %>
    16|     </div>
    17|     <% include ../partials/delete-confirm %>

Could not find the include file "../dashboard/hello"
info: 2024-11-11 11:24:35: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:25:29: activity: 	Super Admin having Super Admin role has viewed home module
info: 2024-11-11 11:28:08: activity: 	Super Admin having Super Admin role has viewed  module
info: 2024-11-11 11:28:12: activity: 	Super Admin having Super Admin role has viewed 7e628d6b-5e1c-4c34-a202-02ce11b81607 module
info: 2024-11-11 11:28:18: activity: 	Super Admin having Super Admin role has viewed 7e628d6b-5e1c-4c34-a202-02ce11b8160734232432 module
info: 2024-11-11 11:28:19: activity: 	Super Admin having Super Admin role has viewed 404 module