new logging api
parent
e963a19d4b
commit
e1e6d51038
@ -0,0 +1,99 @@
|
||||
/*jshint esversion: 6 */
|
||||
var Store = require("../storage/file");
|
||||
|
||||
var Logger = module.exports;
|
||||
|
||||
/* Every line in the log should contain:
|
||||
* timestamp
|
||||
* public key of initiator
|
||||
* the action
|
||||
* the event's tag
|
||||
*/
|
||||
var messageTemplate = function (type, time, tag, info) {
|
||||
return JSON.stringify([type.toUpperCase(), time, tag, info]);
|
||||
};
|
||||
|
||||
var write = function (ctx, content) {
|
||||
ctx.store.log(ctx.channelName, content);
|
||||
};
|
||||
|
||||
// various degrees of logging
|
||||
const logLevels = ['silly', 'debug', 'verbose', 'feedback', 'info', 'warn', 'error'];
|
||||
|
||||
var handlers = {
|
||||
silly: function (ctx, time, tag, info) {
|
||||
console.log('[SILLY]', time, tag, info);
|
||||
},
|
||||
debug: function (ctx, time, tag, info) {
|
||||
console.log('[DEBUG]', time, tag, info);
|
||||
},
|
||||
verbose: function (ctx, time, tag, info) {
|
||||
console.log('[VERBOSE]', time, tag, info);
|
||||
},
|
||||
feedback: function (ctx, time, tag, info) {
|
||||
console.log('[FEEDBACK]', time, tag, info);
|
||||
},
|
||||
info: function (ctx, time, tag, info) {
|
||||
console.info('[INFO]', time, tag, info);
|
||||
},
|
||||
warn: function (ctx, time, tag, info) {
|
||||
console.warn('[WARN]', time, tag, info);
|
||||
},
|
||||
error: function (ctx, time, tag, info) {
|
||||
console.error('[ERROR]', time, tag, info);
|
||||
}
|
||||
};
|
||||
|
||||
var createLogType = function (ctx, type) {
|
||||
return function (tag, info) {
|
||||
var time = new Date().toISOString();
|
||||
var content;
|
||||
try {
|
||||
content = messageTemplate(type, time, tag, info);
|
||||
} catch (e) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (ctx.logToStdout && typeof(handlers[type]) === 'function') {
|
||||
handlers[type](ctx, time, tag, info);
|
||||
}
|
||||
write(ctx, content);
|
||||
};
|
||||
};
|
||||
|
||||
// Log.verbose('THING', x);
|
||||
Logger.create = function (config, cb) {
|
||||
if (!config.logPath) {
|
||||
// XXX don't crash, print that you won't log to file
|
||||
throw new Error("Logger: Expected filePath");
|
||||
}
|
||||
|
||||
/* config: {
|
||||
filePath: '???',
|
||||
logLevel: 'silly',
|
||||
} */
|
||||
|
||||
var date = new Date();
|
||||
var launchTime = ('' + date.getUTCFullYear()).slice(-2) + date.toISOString();
|
||||
|
||||
Store.create({
|
||||
filePath: config.logPath,
|
||||
}, function (store) {
|
||||
var ctx = {
|
||||
store: store,
|
||||
channelName: launchTime,
|
||||
logFeedback: Boolean(config.logFeedback),
|
||||
// TODO respect configured log settings
|
||||
logLevel: logLevels.indexOf(config.logLevel), // 0 for silly, 1 for debug
|
||||
};
|
||||
|
||||
var log = {};
|
||||
logLevels.forEach(function (type) {
|
||||
log[type] = createLogType(ctx, type);
|
||||
});
|
||||
|
||||
cb(Object.freeze(log));
|
||||
});
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue