110 lines
3.5 KiB
TypeScript
110 lines
3.5 KiB
TypeScript
import {Logger, TaggedLogger} from "./types";
|
|
|
|
function procConsole() {
|
|
// @ts-ignore
|
|
return process.console;
|
|
}
|
|
|
|
const noopTaggedLogger: TaggedLogger = {
|
|
debug(...args: any): void {},
|
|
info(...args: any): void {},
|
|
warn(...args: any): void {},
|
|
error(...args: any): void {},
|
|
profile(...args: any): void {},
|
|
};
|
|
|
|
class ActivatableLogger implements Logger {
|
|
private enabled: boolean = false;
|
|
|
|
init(): void {
|
|
const app = require('./app').app;
|
|
const config = require('./config').config;
|
|
|
|
const enabled = config.server.logging.enabled;
|
|
this.enabled = enabled;
|
|
|
|
// Hack to allow proper logging of Error.
|
|
Object.defineProperty(Error.prototype, 'message', {
|
|
configurable: true,
|
|
enumerable: true
|
|
});
|
|
Object.defineProperty(Error.prototype, 'stack', {
|
|
configurable: true,
|
|
enumerable: true
|
|
});
|
|
|
|
const scribe = require('scribe-js')({
|
|
rootPath: config.server.logging.directory,
|
|
});
|
|
|
|
function addLogger(name: string, color: string, active: boolean) {
|
|
if (enabled && active) {
|
|
procConsole().addLogger(name, color, {
|
|
logInConsole: false
|
|
});
|
|
} else {
|
|
// @ts-ignore
|
|
procConsole()[name] = function () {
|
|
this._reset(); // forget tags, etc. for this logging event
|
|
};
|
|
}
|
|
}
|
|
|
|
addLogger('debug', 'grey', config.server.logging.debug);
|
|
addLogger('profile', 'blue', config.server.logging.profile);
|
|
|
|
if (enabled && config.server.logging.logRequests) {
|
|
app.use(scribe.express.logger());
|
|
}
|
|
if (config.server.internal.active) {
|
|
const prefix = config.server.rootPath === '/' ? '' : config.server.rootPath;
|
|
app.use(prefix + '/internal/logs', scribe.webPanel());
|
|
}
|
|
|
|
// Hack to allow correct logging of node.js Error objects.
|
|
// See: https://github.com/bluejamesbond/Scribe.js/issues/70
|
|
Object.defineProperty(Error.prototype, 'toJSON', {
|
|
configurable: true,
|
|
value: function () {
|
|
const alt: {[key: string]: any} = {};
|
|
const storeKey = (key: string) => {
|
|
alt[key] = this[key];
|
|
};
|
|
Object.getOwnPropertyNames(this).forEach(storeKey, this);
|
|
return alt;
|
|
}
|
|
});
|
|
|
|
// @ts-ignore
|
|
for (const key of Object.keys(procConsole())) {
|
|
// @ts-ignore
|
|
module.exports[key] = enabled ? procConsole()[key] : (...args: any) => {};
|
|
}
|
|
}
|
|
|
|
tag(...tags: any): TaggedLogger {
|
|
if (this.enabled) {
|
|
return {
|
|
debug(...args: any): void {
|
|
procConsole().tag(...tags).debug(...args);
|
|
},
|
|
info(...args: any): void {
|
|
procConsole().tag(...tags).info(...args);
|
|
},
|
|
warn(...args: any): void {
|
|
procConsole().tag(...tags).warn(...args);
|
|
},
|
|
error(...args: any): void {
|
|
procConsole().tag(...tags).error(...args);
|
|
},
|
|
profile(...args: any): void {
|
|
procConsole().tag(...tags).profile(...args);
|
|
},
|
|
}
|
|
} else {
|
|
return noopTaggedLogger;
|
|
}
|
|
}
|
|
}
|
|
|
|
export default new ActivatableLogger() as Logger;
|