forked from mirrors/Scribe.js
333 lines
7.6 KiB
JavaScript
333 lines
7.6 KiB
JavaScript
/* jshint -W098 */
|
|
(function() {
|
|
|
|
'use strict';
|
|
|
|
var moment = require('moment'),
|
|
fs = require('fs'),
|
|
mkdirp = require('mkdirp'),
|
|
path = require('path');
|
|
|
|
|
|
/**
|
|
* rootPaths
|
|
*
|
|
* Store all rootPaths
|
|
* @type {Array}
|
|
*/
|
|
var rootPaths = [];
|
|
|
|
|
|
/**
|
|
* LogWriter
|
|
*
|
|
* Save console logs on disk
|
|
*
|
|
* @constructor
|
|
*
|
|
* @param {String} rootPath root logs folder
|
|
*/
|
|
var LogWriter = function(rootPath) {
|
|
|
|
this.rootPath = rootPath || 'logs';
|
|
|
|
//Init history
|
|
this.initHistory();
|
|
};
|
|
|
|
/**
|
|
* LogWriter.prototype.initHistory
|
|
*
|
|
* Attach and init the history property
|
|
*/
|
|
LogWriter.prototype.initHistory = function() {
|
|
|
|
this.history = {
|
|
dates: {}
|
|
};
|
|
|
|
var historyPath = path.join(this.rootPath, 'history.json');
|
|
|
|
if (!fs.existsSync(historyPath)) { //create file if doesn't exist yet
|
|
|
|
this.writeFile(
|
|
historyPath,
|
|
this.history,
|
|
function(err) {
|
|
if (err) {
|
|
throw err;
|
|
}
|
|
}
|
|
);
|
|
|
|
} else { //get history if file exists
|
|
|
|
var self = this;
|
|
|
|
fs.readFile(historyPath, {
|
|
"encoding" : "utf-8"
|
|
}, function(err, data) {
|
|
if (err) {
|
|
throw err;
|
|
} else {
|
|
try {
|
|
self.history = JSON.parse(data);
|
|
} catch (e) {
|
|
throw e;
|
|
}
|
|
}
|
|
});
|
|
}
|
|
};
|
|
|
|
/**
|
|
* LogWriter.prototype.createDir
|
|
*
|
|
* Create a dir if it doesn't exist yet
|
|
*
|
|
* @param {String} path The dir
|
|
* @param {Function} callback
|
|
*/
|
|
LogWriter.prototype.createDir = function(path, callback) {
|
|
|
|
mkdirp(path, function(err) {
|
|
callback(err);
|
|
});
|
|
};
|
|
|
|
/**
|
|
* LogWriter.prototype.appendFile
|
|
*
|
|
* Append content to a file
|
|
*
|
|
* @param {String} pathToFile The file
|
|
* @param {String} content
|
|
* @param {Function} callback
|
|
*/
|
|
LogWriter.prototype.appendFile = function(pathToFile, content, callback) {
|
|
|
|
var self = this;
|
|
|
|
self.createDir(path.dirname(pathToFile), function(err) {
|
|
|
|
if (err) {
|
|
callback(err);
|
|
} else {
|
|
|
|
var newFile = !fs.existsSync(pathToFile);
|
|
|
|
fs.appendFile(pathToFile, content, function(err) {
|
|
|
|
if (err) {
|
|
throw err;
|
|
} else if (newFile) {
|
|
self.newFileHistory(pathToFile);
|
|
callback();
|
|
}
|
|
|
|
});
|
|
}
|
|
});
|
|
};
|
|
|
|
/**
|
|
* LogWriter.prototype.writeFile
|
|
*
|
|
* Write content into a file (erase old one)
|
|
*
|
|
* @param {String} pathToFile The file
|
|
* @param {String} content
|
|
* @param {Function} callback
|
|
*/
|
|
LogWriter.prototype.writeFile = function(pathToFile, content, callback) {
|
|
|
|
if (typeof content !== 'string') {
|
|
content = JSON.stringify(content);
|
|
}
|
|
|
|
this.createDir(path.dirname(pathToFile), function(err) {
|
|
if (err) {
|
|
callback(err);
|
|
} else {
|
|
fs.writeFile(pathToFile, content, {
|
|
"encoding" : "utf-8"
|
|
}, callback);
|
|
}
|
|
});
|
|
};
|
|
|
|
/**
|
|
* LogWriter.prototype.newFileHistory
|
|
*
|
|
* Save the new file path in history according to the date
|
|
*
|
|
* @param {String} pathToFile
|
|
*/
|
|
LogWriter.prototype.newFileHistory = function(pathToFile) {
|
|
|
|
var historyPath = path.join(this.rootPath, 'history.json'),
|
|
self = this;
|
|
|
|
var today = moment().startOf('day').valueOf().toString();
|
|
|
|
//Save the path under today key
|
|
|
|
if (!self.history.dates[today]) {
|
|
self.history.dates[today] = [];
|
|
}
|
|
|
|
if (self.history.dates[today].indexOf(pathToFile) === -1) {
|
|
|
|
self.history.dates[today].push(pathToFile);
|
|
|
|
self.writeFile(historyPath, self.history, function(err) {
|
|
if (err) {
|
|
throw err;
|
|
}
|
|
});
|
|
}
|
|
|
|
};
|
|
|
|
/**
|
|
* LogWriter.prototype.getUser
|
|
*
|
|
* Tool, return active user
|
|
*
|
|
* @return {String}
|
|
*/
|
|
LogWriter.prototype.getUser = function() {
|
|
|
|
var user = '';
|
|
|
|
try {
|
|
|
|
var platformKey = process.platform === 'win32' ? 'USERPROFILE' : 'HOME',
|
|
platformDivider = process.platform === 'win32' ? '\\' : '/';
|
|
|
|
var userDir = process.env[platformKey].toLowerCase();
|
|
user = userDir.slice(userDir.lastIndexOf(platformDivider) + 1);
|
|
|
|
} catch (e) {
|
|
user = 'user'; //default
|
|
} finally {
|
|
return user;
|
|
}
|
|
};
|
|
|
|
/**
|
|
* LogWriter.prototype.getPath
|
|
*
|
|
* @param {Object} opt params
|
|
* @param {String} opt.logger logger options
|
|
*
|
|
* @return {String} The path to current folder (without rootPath)
|
|
*/
|
|
LogWriter.prototype.getPath = function(opt) {
|
|
|
|
var now = moment();
|
|
|
|
return path.join(
|
|
now.format('YYYY'),
|
|
now.format('MMM')
|
|
);
|
|
};
|
|
|
|
/**
|
|
* LogWriter.prototype.getFile
|
|
*
|
|
* @param {Object} opt params
|
|
* @param {String} opt.logger logger options
|
|
*
|
|
* @return {String} the filname (with extension)
|
|
*/
|
|
LogWriter.prototype.getFile = function(opt) {
|
|
|
|
var now = moment();
|
|
|
|
return (now.format('DD_MMM_YY')).toLowerCase() +
|
|
'.' +
|
|
opt.logger.name +
|
|
'.json';
|
|
};
|
|
|
|
/**
|
|
* LogWriter.prototype.path
|
|
*
|
|
* @param {Object} opt params
|
|
* @param {String} opt.logger logger options
|
|
*
|
|
* @return {String} the full path to file
|
|
*/
|
|
LogWriter.prototype.path = function(opt) {
|
|
return path.join(
|
|
this.rootPath,
|
|
this.getPath(opt),
|
|
this.getFile(opt)
|
|
);
|
|
};
|
|
|
|
/**
|
|
* LogWriter.prototype.save
|
|
*
|
|
* Save a log on disk
|
|
*
|
|
* @param {Object} log The log to save
|
|
*
|
|
* @param {Object} opt Options
|
|
* @param {String} opt.logger logger options
|
|
*/
|
|
LogWriter.prototype.save = function(log, opt) {
|
|
|
|
try {
|
|
delete log.opt; //we save logger options in rootPath/[logger].json
|
|
} catch(e){
|
|
// ignore
|
|
}
|
|
|
|
var json = JSON.stringify(log);
|
|
|
|
this.appendFile(this.path(opt), json + '\n', function(err) {
|
|
if (err) {
|
|
throw err;
|
|
}
|
|
});
|
|
};
|
|
|
|
/**
|
|
* LogWriter.prototype.saveOpt
|
|
*
|
|
* Save logger opt in root folder
|
|
*
|
|
* @param {Object} logger Logger options.
|
|
*/
|
|
LogWriter.prototype.saveOpt = function(logger) {
|
|
|
|
var filePath = path.join(this.rootPath, logger.name + '.json');
|
|
|
|
this.writeFile(filePath, JSON.stringify(logger), function(err) {
|
|
if (err) {
|
|
throw err;
|
|
}
|
|
});
|
|
};
|
|
|
|
/**
|
|
* LogWriter.prototype.addLogger
|
|
*
|
|
* Simply call this.saveOpt() from now
|
|
* but could be use for more
|
|
*
|
|
* @param {Object} logger Console2 logger options
|
|
*/
|
|
LogWriter.prototype.addLogger = function(logger) {
|
|
this.saveOpt(logger);
|
|
};
|
|
|
|
|
|
module.exports = {
|
|
LogWriter: LogWriter,
|
|
folders: rootPaths
|
|
};
|
|
|
|
}());
|