Skip to content

[Feat] : Winston Logging added. #2814

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 2 commits into from
Closed
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
Empty file added app-error.log
Empty file.
Empty file added app-info.log
Empty file.
333 changes: 326 additions & 7 deletions package-lock.json

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -255,6 +255,7 @@
"uuid": "^8.3.2",
"webpack": "^5.76.0",
"webpack-dev-middleware": "^5.3.1",
"winston": "^3.11.0",
"xhr": "^2.6.0"
}
}
5 changes: 3 additions & 2 deletions server/config/passport.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import GoogleStrategy from 'passport-google-oauth20';
import { BasicStrategy } from 'passport-http';

import User from '../models/user';
import logger from '../logger/winton';

const accountSuspensionMessage =
'Account has been suspended. Please contact [email protected] if you believe this is an error.';
Expand Down Expand Up @@ -274,7 +275,7 @@ passport.use(
User.EmailConfirmation.Verified;
existingEmailUser.save((saveErr) => {
if (saveErr) {
console.log(saveErr);
logger.debug(saveErr);
}
done(null, existingEmailUser);
});
Expand All @@ -288,7 +289,7 @@ passport.use(
user.verified = User.EmailConfirmation.Verified;
user.save((saveErr) => {
if (saveErr) {
console.log(saveErr);
logger.debug(saveErr);
}
done(null, user);
});
Expand Down
5 changes: 3 additions & 2 deletions server/controllers/aws.controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import s3 from '@auth0/s3';
import mongoose from 'mongoose';
import { getProjectsForUserId } from './project.controller';
import { findUserByUsername } from './user.controller';
import logger from '../logger/winton';

const { ObjectId } = mongoose.Types;

Expand Down Expand Up @@ -230,8 +231,8 @@ export function listObjectsInS3ForUser(userId) {
return Promise.resolve({ assets: projectAssets, totalSize });
})
.catch((err) => {
console.log('got an error');
console.log(err);
logger.debug('got an error');
logger.debug(err);
});
}

Expand Down
5 changes: 3 additions & 2 deletions server/controllers/file.controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import isBefore from 'date-fns/isBefore';
import Project from '../models/project';
import { resolvePathToFile } from '../utils/filePath';
import { deleteObjectsFromS3, getObjectKey } from './aws.controller';
import logger from '../logger/winton';

// Bug -> timestamps don't get created, but it seems like this will
// be fixed in mongoose soon
Expand All @@ -24,7 +25,7 @@ export function createFile(req, res) {
},
(err, updatedProject) => {
if (err || !updatedProject) {
console.log(err);
logger.error(err);
res.status(403).send({
success: false,
message: 'Project does not exist, or user does not match owner.'
Expand All @@ -35,7 +36,7 @@ export function createFile(req, res) {
updatedProject.files.id(req.body.parentId).children.push(newFile.id);
updatedProject.save((innerErr, savedProject) => {
if (innerErr) {
console.log(innerErr);
logger.error(innerErr);
res.json({ success: false });
return;
}
Expand Down
9 changes: 5 additions & 4 deletions server/controllers/project.controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import Project from '../models/project';
import User from '../models/user';
import { resolvePathToFile } from '../utils/filePath';
import generateFileSystemSafeName from '../utils/generateFileSystemSafeName';
import logger from '../logger/winton';

export {
default as createProject,
Expand Down Expand Up @@ -52,7 +53,7 @@ export function updateProject(req, res) {
.populate('user', 'username')
.exec((updateProjectErr, updatedProject) => {
if (updateProjectErr) {
console.log(updateProjectErr);
logger.error(updateProjectErr);
res.status(400).json({ success: false });
return;
}
Expand All @@ -70,7 +71,7 @@ export function updateProject(req, res) {
});
updatedProject.save((innerErr, savedProject) => {
if (innerErr) {
console.log(innerErr);
logger.error(innerErr);
res.status(400).json({ success: false });
return;
}
Expand Down Expand Up @@ -98,7 +99,7 @@ export function getProject(req, res) {
.populate('user', 'username')
.exec((err, project) => { // eslint-disable-line
if (err) {
console.log(err);
logger.error(err);
return res
.status(404)
.send({ message: 'Project with that id does not exist' });
Expand All @@ -115,7 +116,7 @@ export function getProjectsForUserId(userId) {
.select('name files id createdAt updatedAt')
.exec((err, projects) => {
if (err) {
console.log(err);
logger.error(err);
}
resolve(projects);
});
Expand Down
3 changes: 2 additions & 1 deletion server/controllers/project.controller/createProject.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import {
FileValidationError,
ProjectValidationError
} from '../../domain-objects/Project';
import logger from '../../logger/winton';

export default function createProject(req, res) {
let projectValues = {
Expand Down Expand Up @@ -59,7 +60,7 @@ export function apiCreateProject(req, res) {

function checkUserHasPermission() {
if (req.user.username !== req.params.username) {
console.log('no permission');
logger.error('no permission');
const error = new ProjectValidationError(
`'${req.user.username}' does not have permission to create for '${req.params.username}'`
);
Expand Down
3 changes: 2 additions & 1 deletion server/controllers/user.controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import async from 'async';
import User from '../models/user';
import mail from '../utils/mail';
import { renderEmailConfirmation, renderResetPassword } from '../views/mail';
import logger from '../logger/winton';

export * from './user.controller/apiKey';

Expand Down Expand Up @@ -181,7 +182,7 @@ export function resetPasswordInitiate(req, res) {
],
(err) => {
if (err) {
console.log(err);
logger.error(err);
res.json({ success: false });
return;
}
Expand Down
18 changes: 18 additions & 0 deletions server/logger/dev-logger.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import winston from 'winston';

const { combine, timestamp, printf, colorize, align } = winston.format;

// eslint-disable-next-line import/prefer-default-export
export const developmentLogger = () => {
const logger = winston.createLogger({
level: 'debug',
format: combine(
timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
align(),
colorize({ all: true }),
printf((info) => `[${info.timestamp}] ${info.level}: ${info.message}`)
),
transports: [new winston.transports.Console()]
});
return logger;
};
32 changes: 32 additions & 0 deletions server/logger/prod-logger.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
import winston from 'winston';

const { combine, timestamp, json } = winston.format;

const errorFilter = winston.format((info, opts) =>
info.level === 'error' ? info : false
);

const infoFilter = winston.format((info, opts) =>
info.level === 'info' ? info : false
);

// eslint-disable-next-line import/prefer-default-export
export const productionLogger = () => {
const logger = winston.createLogger({
level: 'info',
format: combine(timestamp(), json()),
transports: [
new winston.transports.File({
filename: 'app-error.log',
level: 'error',
format: combine(errorFilter(), timestamp(), json())
}),
new winston.transports.File({
filename: 'app-info.log',
level: 'info',
format: combine(infoFilter(), timestamp(), json())
})
]
});
return logger;
};
14 changes: 14 additions & 0 deletions server/logger/winton.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { developmentLogger } from './dev-logger';
import { productionLogger } from './prod-logger';

// eslint-disable-next-line import/no-mutable-exports
let logger = null;

if (process.env.NODE_ENV !== 'production') {
logger = developmentLogger();
}
if (process.env.NODE_ENV === 'development') {
logger = productionLogger();
}

export default logger;
21 changes: 11 additions & 10 deletions server/migrations/db_reformat.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
import mongoose from 'mongoose';
import path from 'path';
import { uniqWith, isEqual } from 'lodash';
require('dotenv').config({path: path.resolve('.env')});
require('dotenv').config({ path: path.resolve('.env') });
const ObjectId = mongoose.Types.ObjectId;
mongoose.connect('mongodb://localhost:27017/p5js-web-editor');
mongoose.connection.on('error', () => {
Expand All @@ -14,6 +14,7 @@ import Project from '../models/project';
import User from '../models/user';

import s3 from '@auth0/s3';
import logger from '../logger/winton';

let client = s3.createClient({
maxAsyncS3: 20,
Expand All @@ -39,27 +40,27 @@ Project.find({})
}
});
});
console.log(s3Files.length);
logger.debug(s3Files.length);
s3Files = uniqWith(s3Files, isEqual);
console.log(s3Files.length);
logger.debug(s3Files.length);
});

const uploadedFiles = [];
const params = {'s3Params': {'Bucket': `${process.env.S3_BUCKET}`}};
const params = { 's3Params': { 'Bucket': `${process.env.S3_BUCKET}` } };
let objectsResponse = client.listObjects(params);
objectsResponse.on('data', function(objects) {
objectsResponse.on('data', function (objects) {
objects.Contents.forEach(object => {
uploadedFiles.push(object.Key);
});
});

const filesToDelete = [];
objectsResponse.on('end', () => {
console.log(uploadedFiles.length);
logger.debug(uploadedFiles.length);
uploadedFiles.forEach(fileKey => {
if (s3Files.indexOf(fileKey) === -1) {
//delete file
filesToDelete.push({Key: fileKey});
filesToDelete.push({ Key: fileKey });
// console.log("would delete file: ", fileKey);
}
});
Expand All @@ -76,9 +77,9 @@ objectsResponse.on('end', () => {
// del.on('end', () => {
// console.log('deleted extra S3 files!');
// });
console.log("To delete: ", filesToDelete.length);
console.log("Total S3 files: ", uploadedFiles.length);
console.log("Total S3 files in mongo: ", s3Files.length);
logger.debug("To delete: ", filesToDelete.length);
logger.debug("Total S3 files: ", uploadedFiles.length);
logger.debug("Total S3 files in mongo: ", s3Files.length);
});

// let projectsNotToUpdate;
Expand Down
33 changes: 17 additions & 16 deletions server/migrations/emailConsolidation.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import {
} from '../controllers/aws.controller';
import mail from '../utils/mail';
import { renderAccountConsolidation } from '../views/mail';
import logger from '../logger/winton';

const mongoConnectionString = process.env.MONGO_URL;
const { ObjectId } = mongoose.Types;
Expand Down Expand Up @@ -87,9 +88,9 @@ let duplicates = null;
fs.readFile('duplicates.json', async (err, file) => {
const result = JSON.parse(file);
for (let i = 3000; i < result.length; i += 1) {
console.log('Index: ', i);
logger.debug('Index: ', i);
const email = result[i]._id;
console.log(email);
logger.debug(email);
await consolidateAccount(email); // eslint-disable-line
}
process.exit(0);
Expand All @@ -102,18 +103,18 @@ async function consolidateAccount(email) {
.exec()
.then((result) => {
[currentUser, ...duplicates] = result;
console.log('Current User: ', currentUser._id, ' ', currentUser.email);
logger.debug('Current User: ', currentUser._id, ' ', currentUser.email);
duplicates = duplicates.map((dup) => dup._id);
console.log('Duplicates: ', duplicates);
logger.debug('Duplicates: ', duplicates);
return Project.find({
user: { $in: duplicates }
}).exec();
})
.then((sketches) => {
const saveSketchPromises = [];
sketches.forEach((sketch) => {
console.log('SketchId: ', sketch._id);
console.log('UserId: ', sketch.user);
logger.debug('SketchId: ', sketch._id);
logger.debug('UserId: ', sketch.user);
const moveSketchFilesPromises = [];
sketch.files.forEach((file) => {
// if the file url contains sketch user
Expand All @@ -131,8 +132,8 @@ async function consolidateAccount(email) {
file.url = newUrl;
})
.catch((err) => {
console.log('Move Error:');
console.log(err);
logger.error('Move Error:');
logger.error(err);
});
moveSketchFilesPromises.push(fileSavePromise);
} else {
Expand All @@ -141,8 +142,8 @@ async function consolidateAccount(email) {
file.url = newUrl;
})
.catch((err) => {
console.log('Copy Error:');
console.log(err);
logger.error('Copy Error:');
logger.error(err);
});
moveSketchFilesPromises.push(fileSavePromise);
}
Expand All @@ -159,23 +160,23 @@ async function consolidateAccount(email) {
return Promise.all(saveSketchPromises);
})
.then(() => {
console.log('Moved and updated all sketches.');
logger.debug('Moved and updated all sketches.');
return Collection.updateMany(
{ owner: { $in: duplicates } },
{ $set: { owner: ObjectId(currentUser.id) } }
);
})
.then(() => {
console.log('Moved and updated all collections.');
logger.debug('Moved and updated all collections.');
return User.deleteMany({ _id: { $in: duplicates } });
})
.then(() => {
console.log('Deleted other user accounts.');
logger.debug('Deleted other user accounts.');
currentUser.email = currentUser.email.toLowerCase();
return currentUser.save();
})
.then(() => {
console.log('Migrated email to lowercase.');
logger.debug('Migrated email to lowercase.');
// const protocol = process.env.NODE_ENV === 'production' ? 'https' : 'http';
const mailOptions = renderAccountConsolidation({
body: {
Expand All @@ -188,7 +189,7 @@ async function consolidateAccount(email) {

return new Promise((resolve, reject) => {
mail.send(mailOptions, (mailErr, result) => {
console.log('Sent email.');
logger.debug('Sent email.');
if (mailErr) {
return reject(mailErr);
}
Expand All @@ -197,7 +198,7 @@ async function consolidateAccount(email) {
});
})
.catch((err) => {
console.log(err);
logger.error(err);
process.exit(1);
});
}
Expand Down
Loading