How to create Logger in NodeJS ?

Logging in NodeJS Applications

We will see simple method of logging a very simple server program.

Log Levels

Some applications process hundreds of millions of transactions every day, if we log all this out to a single file then we could be traversing hundreds of millions of lines of log files in order to find errors. This is time consuming and can be made unnecessary through using multiple levels of logging.

In this tutorial we are going to be creating 3 different log files for our simple server application, all of which take different levels of log messages. The levels will be as follows:

Info, Warning, Error

Not only that but we’ll set up a system where we create a new file every day so that we can narrow any error searches further.

index.js

We create a router file , which will act as our servers middle ware for request


var express = require('express');
var router = express.Router();
// Here we import our Logger file and instantiate a logger object
var loggers = require('../logger').Logger;

/* GET home page. */
router.get('/', function(req, res, next) {
  res.render('index', { title: 'Express' });
});

module.exports = router;

app.js

Then we will create server


var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');


var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', indexRouter);
app.use('/users', usersRouter);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  next(createError(404));
});

// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

module.exports = app;

Implementing Our Logging System

Now that we’ve got a basic application running on port 3000, we can now begin to create our simple logging system;

Create a new file called logger.js in your projects directory:


// Firstly we'll need to import the fs library
var fs = require('fs');

// next we'll want make our Logger object available
// to whatever file references it.
var Logger = exports.Logger = {};


// Create 3 sets of write streams for the 3 levels of logging we wish to do
// every time we get an error we'll append to our error streams, any debug message
// to our debug stream etc...
var infoStream = fs.createWriteStream('logs/info.txt');
// Notice we set the path of our log files in the first parameter of 
// fs.createWriteStream. This could easily be pulled in from a config
// file if needed.
var errorStream = fs.createWriteStream('logs/error.txt');
// createWriteStream takes in options as a second, optional parameter
// if you wanted to set the file encoding of your output file you could
// do so by setting it like so: ('logs/debug.txt' , { encoding : 'utf-8' });
var debugStream = fs.createWriteStream('logs/debug.txt');


// Finally we create 3 different functions
// each of which appends our given messages to 
// their own log files along with the current date as an
// iso string and a \n newline character
Logger.info = function(msg) {
  var message = new Date().toISOString() + " : " + msg + "\n";
  infoStream.write(message);
};

Logger.debug = function(msg) {
  var message = new Date().toISOString() + " : " + msg + "\n";
  debugStream.write(message);
};

Logger.error = function(msg) {
  var message = new Date().toISOString() + " : " + msg + "\n";
  errorStream.write(message);
};

Using our new Logging System:

Now that we’ve implemented our basic logging system we can go back into our index.js file and add the following:

var express = require('express');
var router = express.Router();
// Here we import our Logger file and instantiate a logger object
var loggers = require('../logger').Logger;

/* GET home page. */
router.get('/', function(req, res, next) {
  loggers.info('My Test Logger');
  res.render('index', { title: 'Express' });
});

module.exports = router;

NodeJSLoggerFile

Leave a Reply

Your email address will not be published. Required fields are marked *