From 12a13f47bf49d340b6ba46d2a66929520e609d21 Mon Sep 17 00:00:00 2001 From: baldo Date: Mon, 23 Aug 2021 21:05:17 +0200 Subject: [PATCH] Allow to completely disable logging. --- README.md | 2 + config.json.example | 1 + server/logger.ts | 164 ++++++++++++++++++++++------------------- server/types/config.ts | 1 + 4 files changed, 94 insertions(+), 74 deletions(-) diff --git a/README.md b/README.md index dfbb814..19f2edc 100644 --- a/README.md +++ b/README.md @@ -114,6 +114,8 @@ Dann die `config.json` anpassen nach belieben. Es gibt die folgenden Konfigurati * **`server.databaseFile`** Pfad zur Datenbank-Datei, z. B.: `"$FFFFNG_HOME/ffffng.sqlite"` * **`server.peersPath`** Verzeichnis unter dem die `fastd` Key-Files angelegt werden, z. B.: `"$FFFFNG_HOME/fastdkeys"` +* **`server.logging.enabled`** Ob geloggt werden soll (Achtung: `false` sorgt dafür, dass überhaupt kein Output mehr auf + `stdout` oder in den Logs erscheint und überschreibt damit alle anderen Logging-Optionen!), z. B.: `false` * **`server.logging.directory`** Verzeichnis unter dem Log-Files abgelegt werden, z. B.: `"$FFFFNG_HOME/logs"` * **`server.logging.debug`** Gibt an, ob Debug-Output geloggt werden soll (Achtung, viel!), z. B.: `false` * **`server.logging.profile`** Gibt an, ob Profiling-Output geloggt werden soll (Achtung, viel!), z. B.: `false` diff --git a/config.json.example b/config.json.example index 370a99a..a7e32af 100644 --- a/config.json.example +++ b/config.json.example @@ -7,6 +7,7 @@ "peersPath": "/tmp/peers", "logging": { + "enabled": true, "directory": "/tmp/logs", "debug": false, "profile": false, diff --git a/server/logger.ts b/server/logger.ts index 9c62107..7add4dc 100644 --- a/server/logger.ts +++ b/server/logger.ts @@ -5,90 +5,106 @@ function procConsole() { return process.console; } -function init(): void { - const app = require('./app').app; - const config = require('./config').config; +const noopTaggedLogger: TaggedLogger = { + debug(...args: any): void {}, + info(...args: any): void {}, + warn(...args: any): void {}, + error(...args: any): void {}, + profile(...args: any): void {}, +}; - // 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 - }); +class ActivatableLogger implements Logger { + private enabled: boolean = false; + init(): void { + const app = require('./app').app; + const config = require('./config').config; - const scribe = require('scribe-js')({ - rootPath: config.server.logging.directory, - }); + const enabled = config.server.logging.enabled; + this.enabled = enabled; - function addLogger(name: string, color: string, active: boolean) { - if (active) { - procConsole().addLogger(name, color, { - logInConsole: false - }); - } else { - // @ts-ignore - procConsole()[name] = function () { - this._reset(); // forget tags, etc. for this logging event - }; + // 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); + addLogger('debug', 'grey', config.server.logging.debug); + addLogger('profile', 'blue', config.server.logging.profile); - if (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; + 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()); } - }); - // @ts-ignore - for (const key of Object.keys(procConsole())) { + // 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 - module.exports[key] = procConsole()[key]; + 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; + } } } -const logger: Logger = { - init, - tag(...tags): TaggedLogger { - 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); - }, - } - } -}; -export default logger; +export default new ActivatableLogger() as Logger; diff --git a/server/types/config.ts b/server/types/config.ts index 4b2ae21..664e386 100644 --- a/server/types/config.ts +++ b/server/types/config.ts @@ -6,6 +6,7 @@ export type Version = string; export class LoggingConfig { constructor( + @Field("enabled") public enabled: boolean, @Field("directory") public directory: string, @Field("debug") public debug: boolean, @Field("profile") public profile: boolean,