From d0ad2c97745328ea2a392f18207711b546dd3eba Mon Sep 17 00:00:00 2001 From: minherz Date: Wed, 8 Dec 2021 19:47:07 +0000 Subject: [PATCH 1/7] fix: use nodejs-logging Replaces 'console-log-level' with '@google-cloud/logging-min' to write logs to stdout. --- package.json | 1 + src/logger.ts | 75 ++++++++++++++++++++++++++++++++++----------------- 2 files changed, 52 insertions(+), 24 deletions(-) diff --git a/package.json b/package.json index 93d659f4..6e892039 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,7 @@ "license": "Apache-2.0", "dependencies": { "@google-cloud/common": "^3.0.0", + "@google-cloud/logging-min": "^9.6.3", "@types/console-log-level": "^1.4.0", "@types/semver": "^7.0.0", "console-log-level": "^1.4.0", diff --git a/src/logger.ts b/src/logger.ts index fd0c0d47..d2e2f31b 100644 --- a/src/logger.ts +++ b/src/logger.ts @@ -12,36 +12,63 @@ // See the License for the specific language governing permissions and // limitations under the License. -import * as consoleLogLevel from 'console-log-level'; +/* eslint-disable @typescript-eslint/no-explicit-any */ + import {defaultConfig} from './config'; +import {LogSync, Logging} from '@google-cloud/logging-min'; + +const logging = new Logging(); // eslint-disable-next-line @typescript-eslint/no-var-requires const pjson = require('../../package.json'); -const LEVEL_NAMES: consoleLogLevel.LogLevelNames[] = [ - 'fatal', - 'error', - 'warn', - 'info', - 'debug', - 'trace', -]; - -function logLevelToName(level?: number): consoleLogLevel.LogLevelNames { - if (level === undefined) { - level = defaultConfig.logLevel; - } else if (level < 0) { - level = 0; - } else if (level > 4) { - level = 4; +export class Logger { + private log: LogSync; + private severityThreshold: number; + + constructor(readonly level?: number) { + if (level === undefined) { + level = defaultConfig.logLevel; + } + if (level < 0) { + level = 0; + } else if (level > 4) { + level = 4; + } + this.severityThreshold = level; + this.log = logging.logSync(pjson.name); + } + + debug(...args: any[]) { + if (this.severityThreshold > 3) { + this.log.debug(this.log.entry(this.convertToMessage(args))); + } + } + + info(...args: any[]) { + if (this.severityThreshold > 2) { + this.log.info(this.log.entry(this.convertToMessage(args))); + } + } + + warn(...args: any[]) { + if (this.severityThreshold > 1) { + this.log.warning(this.log.entry(this.convertToMessage(args))); + } + } + + error(...args: any[]) { + if (this.severityThreshold > 0) { + this.log.error(this.log.entry(this.convertToMessage(args))); + } + } + + private convertToMessage(args: any[]): string { + const result = args.map(v => v + '').join(' '); + return result; } - return LEVEL_NAMES[level]; } -export function createLogger(level?: number) { - return consoleLogLevel({ - stderr: true, - prefix: pjson.name, - level: logLevelToName(level), - }); +export function createLogger(level?: number): Logger { + return new Logger(level); } From 71c24d975e7c32783143dc9098a2b66cbcfc0cff Mon Sep 17 00:00:00 2001 From: minherz Date: Thu, 9 Dec 2021 11:17:38 +0000 Subject: [PATCH 2/7] chore: refactor processing log messages Rolls back to accept a string message for Logger methods. Replaces new line with its escape notation '\\n'. Refactors single location that prints array to print a single string. --- src/index.ts | 7 ++++--- src/logger.ts | 21 ++++++++++----------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/index.ts b/src/index.ts index e696c5ef..c85e6562 100644 --- a/src/index.ts +++ b/src/index.ts @@ -236,7 +236,7 @@ export async function startLocal(config: Config = {}): Promise { setInterval(() => { const curTime = Date.now(); const {rss, heapTotal, heapUsed} = process.memoryUsage(); - logger.debug( + const debugInfo = [ new Date().toISOString(), 'rss', (rss / (1024 * 1024)).toFixed(3), @@ -252,8 +252,9 @@ export async function startLocal(config: Config = {}): Promise { 'profiles/s,', 'time profile collection rate', ((timeProfileCount * 1000) / (curTime - prevLogTime)).toFixed(3), - 'profiles/s' - ); + 'profiles/s', + ].map(v => v + ''); + logger.debug(debugInfo.join(' ')); heapProfileCount = 0; timeProfileCount = 0; diff --git a/src/logger.ts b/src/logger.ts index d2e2f31b..89a25a47 100644 --- a/src/logger.ts +++ b/src/logger.ts @@ -39,33 +39,32 @@ export class Logger { this.log = logging.logSync(pjson.name); } - debug(...args: any[]) { + debug(msg: string) { if (this.severityThreshold > 3) { - this.log.debug(this.log.entry(this.convertToMessage(args))); + this.log.debug(this.log.entry(this.toOneLine(msg))); } } - info(...args: any[]) { + info(msg: string) { if (this.severityThreshold > 2) { - this.log.info(this.log.entry(this.convertToMessage(args))); + this.log.info(this.log.entry(this.toOneLine(msg))); } } - warn(...args: any[]) { + warn(msg: string) { if (this.severityThreshold > 1) { - this.log.warning(this.log.entry(this.convertToMessage(args))); + this.log.warning(this.log.entry(this.toOneLine(msg))); } } - error(...args: any[]) { + error(msg: string) { if (this.severityThreshold > 0) { - this.log.error(this.log.entry(this.convertToMessage(args))); + this.log.error(this.log.entry(this.toOneLine(msg))); } } - private convertToMessage(args: any[]): string { - const result = args.map(v => v + '').join(' '); - return result; + private toOneLine(msg: string): string { + return msg.replace('\n', '\\n'); } } From 287c133a86b2eeba773099dcad57ed9cae70a2b8 Mon Sep 17 00:00:00 2001 From: minherz Date: Thu, 9 Dec 2021 15:31:03 +0000 Subject: [PATCH 3/7] chore: add initialization required for logging --- src/logger.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/logger.ts b/src/logger.ts index 89a25a47..53b59843 100644 --- a/src/logger.ts +++ b/src/logger.ts @@ -19,6 +19,13 @@ import {LogSync, Logging} from '@google-cloud/logging-min'; const logging = new Logging(); +logging.setProjectId().catch(err => { + console.error(`failed to set logging project id ${err}`); +}); +logging.setDetectedResource().catch(err => { + console.error(`failed to discover resource metadata ${err}`); +}); + // eslint-disable-next-line @typescript-eslint/no-var-requires const pjson = require('../../package.json'); From 661dd404a6f0e4adb21d57bf039c6168f8d87117 Mon Sep 17 00:00:00 2001 From: minherz Date: Fri, 10 Dec 2021 07:13:48 +0000 Subject: [PATCH 4/7] chore: update node versioning --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6e892039..8cd3dc8b 100644 --- a/package.json +++ b/package.json @@ -81,6 +81,6 @@ ] }, "engines": { - "node": ">=10.4.1" + "node": "^12.13.0 || ^14.15.0 || >=16" } } From 416d08ddf03a2db0e62bfd5b165583b9c2300c00 Mon Sep 17 00:00:00 2001 From: minherz Date: Fri, 10 Dec 2021 07:24:27 +0000 Subject: [PATCH 5/7] chore: align node versioning with one in nodejs-logging --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6e892039..ac45cbb8 100644 --- a/package.json +++ b/package.json @@ -81,6 +81,6 @@ ] }, "engines": { - "node": ">=10.4.1" + "node": ">=10" } } From 765be8c9982ce85c2d91038d181c86cfd8b33d37 Mon Sep 17 00:00:00 2001 From: minherz Date: Fri, 17 Dec 2021 06:51:25 +0000 Subject: [PATCH 6/7] chore: fix minimal node 10 version constraint ensure to pass test to not accept node@10.4.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c676b61b..2487630f 100644 --- a/package.json +++ b/package.json @@ -81,6 +81,6 @@ ] }, "engines": { - "node": ">=10" + "node": ">=10.4.1" } } \ No newline at end of file From 764c37b8d3027e4ca08951034bdc95a2c1f41f9c Mon Sep 17 00:00:00 2001 From: minherz Date: Fri, 17 Dec 2021 07:02:32 +0000 Subject: [PATCH 7/7] chore: code refactoring add new line at the end of the package.json. add constants for max and min logging levels. add handling windows new line in the multiline log payload. --- package.json | 2 +- src/logger.ts | 15 ++++++++++----- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 2487630f..eca62912 100644 --- a/package.json +++ b/package.json @@ -83,4 +83,4 @@ "engines": { "node": ">=10.4.1" } -} \ No newline at end of file +} diff --git a/src/logger.ts b/src/logger.ts index 53b59843..999941b9 100644 --- a/src/logger.ts +++ b/src/logger.ts @@ -19,6 +19,10 @@ import {LogSync, Logging} from '@google-cloud/logging-min'; const logging = new Logging(); +// migrating from 'console-log-level' package we keep +// min and max log levels numeric interface used there +const [MIN_LEVEL, MAX_LEVEL] = [0, 4]; + logging.setProjectId().catch(err => { console.error(`failed to set logging project id ${err}`); }); @@ -37,10 +41,10 @@ export class Logger { if (level === undefined) { level = defaultConfig.logLevel; } - if (level < 0) { - level = 0; - } else if (level > 4) { - level = 4; + if (level < MIN_LEVEL) { + level = MIN_LEVEL; + } else if (level > MAX_LEVEL) { + level = MAX_LEVEL; } this.severityThreshold = level; this.log = logging.logSync(pjson.name); @@ -71,7 +75,8 @@ export class Logger { } private toOneLine(msg: string): string { - return msg.replace('\n', '\\n'); + const temp = msg.replace('\r\n', '\\r\\n'); + return temp.replace('\n', '\\n'); } }