Skip to content
Snippets Groups Projects
Commit 98ba4cab authored by Brandon Rodriguez's avatar Brandon Rodriguez
Browse files

Update logging logic to allow writing to log files

parent af496fd2
Branches
No related merge requests found
/**
* Custom logging to create more useful output.
* Simply include this file at the top of other files to get extra logging logic.
*/
// System Imports.
const chalk = require('chalk');
const fs = require('fs');
const path = require('path');
// User Imports.
const getCurrentDate = require('./helper_functions.js');
/**
* Essentially "upgrades" default Javascript console output to be more informative.
......@@ -25,39 +30,159 @@ const path = require('path');
Error.prepareStackTrace = originalPrepareStackTrace;
let relativeFileName = path.relative(process.cwd(), callee.getFileName());
// This is where we actually prepend to our provided log text.
// Generate and log our text to console/file.
let prefix = '';
let console_string = '';
let log_string = '';
if (methodName == 'debug') {
// Prepend text for DEBUG level.
var prefix = ` ${chalk.green('[DEBUG]')} [${relativeFileName} ${callee.getLineNumber()}] `;
// Handling for DEBUG level.
// Generate and print Console text.
prefix = ` ${chalk.green('[DEBUG]')} [${relativeFileName} ${callee.getLineNumber()}] `;
console_string = prefix.concat(firstArgument, ...otherArguments);
originalLoggingMethod(console_string);
// Generate and print Log File text.
prefix = `${getCurrentDate()} [DEBUG] [${relativeFileName} ${callee.getLineNumber()}] `;
log_string = prefix.concat(firstArgument, ...otherArguments, '\n');
write_to_file(log_string, 'debug');
} else if (methodName == 'info') {
// Prepend text for INFO level.
var prefix = ` ${chalk.blue('[INFO]')} [${relativeFileName} ${callee.getLineNumber()}] `;
// Handling for INFO level.
// Generate and print Console text.
prefix = ` ${chalk.blue('[INFO]')} [${relativeFileName} ${callee.getLineNumber()}] `;
console_string = prefix.concat(firstArgument, ...otherArguments);
originalLoggingMethod(console_string);
// Generate and print Log File text.
prefix = `${getCurrentDate()} [INFO] [${relativeFileName} ${callee.getLineNumber()}] `;
log_string = prefix.concat(firstArgument, ...otherArguments, '\n');
write_to_file(log_string, 'info');
} else if (methodName == 'warning' || methodName == 'warn') {
// Prepend text for WARNING level.
var prefix = ` ${chalk.yellow('[WARN]')} [${relativeFileName} ${callee.getLineNumber()}] `;
// Handling for WARNING level.
// Generate and print Console text.
prefix = ` ${chalk.yellow('[WARN]')} [${relativeFileName} ${callee.getLineNumber()}] `;
console_string = prefix.concat(firstArgument, ...otherArguments);
originalLoggingMethod(console_string);
// Generate and print Log File text.
prefix = `${getCurrentDate()} [WARN] [${relativeFileName} ${callee.getLineNumber()}] `;
log_string = prefix.concat(firstArgument, ...otherArguments, '\n');
write_to_file(log_string, 'warn');
} else if (methodName == 'error' || methodName == 'err') {
// Prepend text for ERROR level.
var prefix = ` ${chalk.red('[ERROR]')} [${relativeFileName} ${callee.getLineNumber()}] `;
// Generate and print Console text.
prefix = ` ${chalk.red('[ERROR]')} [${relativeFileName} ${callee.getLineNumber()}] `;
console_string = prefix.concat(firstArgument, ...otherArguments);
originalLoggingMethod(console_string);
// Generate and print Log File text.
prefix = `${getCurrentDate()} [ERROR] [${relativeFileName} ${callee.getLineNumber()}] `;
log_string = prefix.concat(firstArgument, ...otherArguments, '\n');
write_to_file(log_string, 'error');
} else if (methodName == 'log') {
// LOG level does not get prepend text.
var prefix = ' ';
prefix = ' ';
console_string = prefix.concat(firstArgument, ...otherArguments);
originalLoggingMethod(console_string);
} else {
// Fallback prepend text for all other cases.
var prefix = ` [${methodName}] [${relativeFileName} ${callee.getLineNumber()}] `;
prefix = ` [${methodName}] [${relativeFileName} ${callee.getLineNumber()}] `;
console_string = prefix.concat(firstArgument, ...otherArguments);
originalLoggingMethod(console_string);
}
// More magic to generate the console output.
if (typeof firstArgument === 'string') {
originalLoggingMethod(prefix + firstArgument, ...otherArguments);
} else {
originalLoggingMethod(prefix, firstArgument, ...otherArguments);
}
};
});
/**
* Writes provided string to log files.
*/
function write_to_file(log_string, level) {
let directory = './logging/';
let file_location = './logging/info.log';
let log_level = 0;
// Get appropriate level of logger. Based off of Python log levels.
// https://docs.python.org/3/library/logging.html
if (level == 'error') {
log_level = 40;
} else if (level == 'warn') {
log_level = 30;
} else if (level == 'info') {
log_level = 20;
} else if (level == 'debug') {
log_level = 10;
}
console.log('Log Level: ' + log_level);
// Attempt to create logging folder.
fs.mkdir(directory, err => {
// Ignore "dir already exists" errors. Raise all others.
if (err && err.code != 'EEXIST') {
throw err;
}
});
// Attempt to write to appropriate files, based on logging level.
if (log_level >= 40) {
// Error level logging or higher.
fs.appendFile(directory.concat('error.log'), log_string, (err) => {
if (err) {
console.log(err);
throw err;
}
});
}
if (log_level >= 30) {
// Warning level logging or higher.
fs.appendFile(directory.concat('warn.log'), log_string, (err) => {
if (err) {
console.log(err);
throw err;
}
});
}
if (log_level >= 20) {
// Info level logging or higher.
fs.appendFile(directory.concat('info.log'), log_string, (err) => {
if (err) {
console.log(err);
throw err;
}
});
}
if (log_level >= 10) {
// Debug level logging or higher.
fs.appendFile(directory.concat('debug.log'), log_string, (err) => {
if (err) {
console.log(err);
throw err;
}
});
}
}
/**
* Simple test to make sure all loging levels work as expected.
* Should convert this to a proper unit test at a later date.
*/
function testLogLevels() {
console.debug('Debug level test');
console.info('Info level test.');
console.warn('Warn level test.');
console.error('Error level test.');
console.log('Log/default level test.');
}
module.exports = testLogLevels;
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment