Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions app.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ const xss = require('xss-clean');
const hpp = require('hpp');
const cors = require('cors');

const httpLogger = require('./middlewares/httpLogger');
const logger = require('./utils/logger');

const userRoutes = require('./routes/userRoutes');
const globalErrHandler = require('./controllers/errorController');
Expand All @@ -18,6 +20,9 @@ app.use(cors());
// Set security HTTP headers
app.use(helmet());

//implementation logging
app.use(httpLogger);

// Limit request from the same API
const limiter = rateLimit({
max: 150,
Expand Down Expand Up @@ -47,6 +52,7 @@ app.use('/api/v1/users', userRoutes);
// handle undefined Routes
app.use('*', (req, res, next) => {
const err = new AppError(404, 'fail', 'undefined route');
logger.info(`undefined route: ${req.baseUrl}`);
next(err, req, res, next);
});

Expand Down
5 changes: 4 additions & 1 deletion controllers/authController.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ const {
const jwt = require('jsonwebtoken');
const User = require('../models/userModel');
const AppError = require('../utils/appError');

const logger = require("./utils/logger");

const createToken = id => {
return jwt.sign({
Expand Down Expand Up @@ -50,6 +50,7 @@ exports.login = async (req, res, next) => {
});

} catch (err) {
logger.error(err);
next(err);
}
};
Expand Down Expand Up @@ -77,6 +78,7 @@ exports.signup = async (req, res, next) => {
});

} catch (err) {
logger.error(err);
next(err);
}

Expand Down Expand Up @@ -107,6 +109,7 @@ exports.protect = async (req, res, next) => {
next();

} catch (err) {
logger.error(err);
next(err);
}
};
Expand Down
6 changes: 6 additions & 0 deletions controllers/baseController.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
const AppError = require('../utils/appError');
const APIFeatures = require('../utils/apiFeatures');
const logger = require('./utils/logger');

exports.deleteOne = Model => async (req, res, next) => {
try {
Expand All @@ -14,6 +15,7 @@ exports.deleteOne = Model => async (req, res, next) => {
data: null
});
} catch (error) {
logger.error(error);
next(error);
}
};
Expand All @@ -37,6 +39,7 @@ exports.updateOne = Model => async (req, res, next) => {
});

} catch (error) {
logger.error(error);
next(error);
}
};
Expand All @@ -53,6 +56,7 @@ exports.createOne = Model => async (req, res, next) => {
});

} catch (error) {
logger.error(error);
next(error);
}
};
Expand All @@ -72,6 +76,7 @@ exports.getOne = Model => async (req, res, next) => {
}
});
} catch (error) {
logger.error(error);
next(error);
}
};
Expand All @@ -93,6 +98,7 @@ exports.getAll = Model => async (req, res, next) => {
});

} catch (error) {
logger.error(error);
next(error);
}

Expand Down
2 changes: 2 additions & 0 deletions controllers/userController.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
const User = require('../models/userModel');
const base = require('./baseController');
const logger = require('./utils/logger');

exports.deleteMe = async (req, res, next) => {
try {
Expand All @@ -14,6 +15,7 @@ exports.deleteMe = async (req, res, next) => {


} catch (error) {
logger.error(error);
next(error);
}
};
Expand Down
13 changes: 13 additions & 0 deletions middlewares/httpLogger.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
const morgan = require('morgan');
const logger = require('../utils/logger');

class LoggerStream {
write(message) {
logger.info(message.substring(0, message.lastIndexOf('\n')));
}
}

module.exports = morgan(
'combined',
{ stream: new LoggerStream() }
);
6 changes: 4 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@
"jsonwebtoken": "^8.5.1",
"mongoose": "^5.7.7",
"validator": "^12.0.0",
"xss-clean": "^0.1.1"
"xss-clean": "^0.1.1",
"morgan": "^1.9.1",
"winston": "^3.2.1"
}
}
}
4 changes: 4 additions & 0 deletions server.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
const mongoose = require('mongoose');
const dotenv = require('dotenv');
const logger = require("./utils/logger");

dotenv.config({
path: './config.env'
});

process.on('uncaughtException', err => {
console.log('UNCAUGHT EXCEPTION!!! shutting down...');
console.log(err.name, err.message);
logger.error(`UNCAUGHT REJECTON!!! shutting down: ${err.name, err.message}`);
process.exit(1);
});

Expand All @@ -32,6 +35,7 @@ app.listen(port, () => {
process.on('unhandledRejection', err => {
console.log('UNHANDLED REJECTION!!! shutting down ...');
console.log(err.name, err.message);
logger.error(`UNHANDLED REJECTON!!! shutting down: ${err.name, err.message}`);
server.close(() => {
process.exit(1);
});
Expand Down
19 changes: 19 additions & 0 deletions utils/logger.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
const { createLogger, transports, format } = require('winston');

const logger = createLogger({
format: format.combine(
format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss:ms' }),
format.printf(info => `${info.timestamp} ${info.level}: ${info.message}`)
),
transports: [
new transports.File({
filename: './logs/all-logs.log',
json: false,
maxsize: 5242880,
maxFiles: 5,
})
// ,new transports.Console() // log toconsole
]
});

module.exports = logger;