From 243c6b1d691e1ff4be1136caeceb6c7dc3f188a2 Mon Sep 17 00:00:00 2001 From: Corie Watson Date: Mon, 9 Jun 2025 16:49:25 +0100 Subject: [PATCH 1/5] feat: disable error logging stacktrace in message --- spec/logger.spec.ts | 23 +++++++++++++++++++++++ src/logger/index.ts | 7 ++++++- src/v2/options.ts | 9 +++++++++ 3 files changed, 38 insertions(+), 1 deletion(-) diff --git a/spec/logger.spec.ts b/spec/logger.spec.ts index a42a57ee3..2a25cf93e 100644 --- a/spec/logger.spec.ts +++ b/spec/logger.spec.ts @@ -1,6 +1,7 @@ import { expect } from "chai"; import * as logger from "../src/logger"; +import { setGlobalOptions } from "../src/v2"; describe("logger", () => { const stdoutWrite = process.stdout.write.bind(process.stdout); @@ -218,4 +219,26 @@ describe("logger", () => { }); }); }); + + describe("error logging stacktrace", () => { + it("should include stacktrace in error logs", () => { + const message = "Test error with stacktrace"; + logger.error(message); + const messageOutput = JSON.parse(lastErr.trim()).message; + + expect(messageOutput).to.include(`Error: ${message}`); + }); + + it("when disableErrorLoggingTraceback is set to true, should not log stacktrace", () => { + const message = "Test error with traceback disabled"; + setGlobalOptions({ + disableErrorLoggingTraceback: true, + }); + logger.error(message); + expectStderr({ + severity: "ERROR", + message: message, + }); + }); + }); }); diff --git a/src/logger/index.ts b/src/logger/index.ts index 2a2d85ae7..280b164ff 100644 --- a/src/logger/index.ts +++ b/src/logger/index.ts @@ -24,6 +24,7 @@ import { format } from "util"; import { traceContext } from "../common/trace"; import { CONSOLE_SEVERITY, UNPATCHED_CONSOLE } from "./common"; +import { getGlobalOptions } from "../v2/options"; /** * `LogSeverity` indicates the detailed severity of the log entry. See [LogSeverity](https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry#logseverity). @@ -158,7 +159,11 @@ function entryFromArgs(severity: LogSeverity, args: any[]): LogEntry { // mimic `console.*` behavior, see https://nodejs.org/api/console.html#console_console_log_data_args let message = format(...args); - if (severity === "ERROR" && !args.find((arg) => arg instanceof Error)) { + if ( + severity === "ERROR" && + !getGlobalOptions().disableErrorLoggingTraceback && + !args.find((arg) => arg instanceof Error) + ) { message = new Error(message).stack || message; } const out: LogEntry = { diff --git a/src/v2/options.ts b/src/v2/options.ts index 2b1731a77..f230c397d 100644 --- a/src/v2/options.ts +++ b/src/v2/options.ts @@ -232,6 +232,15 @@ export interface GlobalOptions { * may inadvertently be wiped out. */ preserveExternalChanges?: boolean; + + /** + * Controls whether error logging should include the traceback of the error automatically. + * Defaults to false. + * + * @remarks + * When true, the error message will include not include the traceback of the error. + */ + disableErrorLoggingTraceback?: boolean; } let globalOptions: GlobalOptions | undefined; From 06e2743f70b0b67dd48245a2cda239fa54bac13c Mon Sep 17 00:00:00 2001 From: Corie Watson Date: Mon, 9 Jun 2025 16:49:25 +0100 Subject: [PATCH 2/5] feat: disable error logging stacktrace in message --- spec/logger.spec.ts | 23 +++++++++++++++++++++++ src/logger/index.ts | 7 ++++++- src/v2/options.ts | 9 +++++++++ 3 files changed, 38 insertions(+), 1 deletion(-) diff --git a/spec/logger.spec.ts b/spec/logger.spec.ts index a42a57ee3..2a25cf93e 100644 --- a/spec/logger.spec.ts +++ b/spec/logger.spec.ts @@ -1,6 +1,7 @@ import { expect } from "chai"; import * as logger from "../src/logger"; +import { setGlobalOptions } from "../src/v2"; describe("logger", () => { const stdoutWrite = process.stdout.write.bind(process.stdout); @@ -218,4 +219,26 @@ describe("logger", () => { }); }); }); + + describe("error logging stacktrace", () => { + it("should include stacktrace in error logs", () => { + const message = "Test error with stacktrace"; + logger.error(message); + const messageOutput = JSON.parse(lastErr.trim()).message; + + expect(messageOutput).to.include(`Error: ${message}`); + }); + + it("when disableErrorLoggingTraceback is set to true, should not log stacktrace", () => { + const message = "Test error with traceback disabled"; + setGlobalOptions({ + disableErrorLoggingTraceback: true, + }); + logger.error(message); + expectStderr({ + severity: "ERROR", + message: message, + }); + }); + }); }); diff --git a/src/logger/index.ts b/src/logger/index.ts index 2a2d85ae7..280b164ff 100644 --- a/src/logger/index.ts +++ b/src/logger/index.ts @@ -24,6 +24,7 @@ import { format } from "util"; import { traceContext } from "../common/trace"; import { CONSOLE_SEVERITY, UNPATCHED_CONSOLE } from "./common"; +import { getGlobalOptions } from "../v2/options"; /** * `LogSeverity` indicates the detailed severity of the log entry. See [LogSeverity](https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry#logseverity). @@ -158,7 +159,11 @@ function entryFromArgs(severity: LogSeverity, args: any[]): LogEntry { // mimic `console.*` behavior, see https://nodejs.org/api/console.html#console_console_log_data_args let message = format(...args); - if (severity === "ERROR" && !args.find((arg) => arg instanceof Error)) { + if ( + severity === "ERROR" && + !getGlobalOptions().disableErrorLoggingTraceback && + !args.find((arg) => arg instanceof Error) + ) { message = new Error(message).stack || message; } const out: LogEntry = { diff --git a/src/v2/options.ts b/src/v2/options.ts index 608db1fa4..31319dd79 100644 --- a/src/v2/options.ts +++ b/src/v2/options.ts @@ -232,6 +232,15 @@ export interface GlobalOptions { * may inadvertently be wiped out. */ preserveExternalChanges?: boolean; + + /** + * Controls whether error logging should include the traceback of the error automatically. + * Defaults to false. + * + * @remarks + * When true, the error message will include not include the traceback of the error. + */ + disableErrorLoggingTraceback?: boolean; } let globalOptions: GlobalOptions | undefined; From ef1e958904b7c502d9e98e13600ee18362ff3995 Mon Sep 17 00:00:00 2001 From: Corie Watson Date: Wed, 9 Jul 2025 10:30:22 +0100 Subject: [PATCH 3/5] fix: improvements based on feedback --- spec/logger.spec.ts | 22 ++++++++++++++++++---- src/logger/index.ts | 2 +- src/v2/options.ts | 6 +++--- 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/spec/logger.spec.ts b/spec/logger.spec.ts index 2a25cf93e..0b023ab09 100644 --- a/spec/logger.spec.ts +++ b/spec/logger.spec.ts @@ -2,6 +2,7 @@ import { expect } from "chai"; import * as logger from "../src/logger"; import { setGlobalOptions } from "../src/v2"; +import { getGlobalOptions } from "../src/v2/options"; describe("logger", () => { const stdoutWrite = process.stdout.write.bind(process.stdout); @@ -221,18 +222,27 @@ describe("logger", () => { }); describe("error logging stacktrace", () => { - it("should include stacktrace in error logs", () => { + const defaultOptions = getGlobalOptions(); + + beforeEach(() => { + setGlobalOptions(defaultOptions); + }); + + it("when disableErrorLoggingStacktrace is set to false, should include stacktrace in error logs", () => { const message = "Test error with stacktrace"; + setGlobalOptions({ + disableErrorLoggingStacktrace: false, + }); logger.error(message); const messageOutput = JSON.parse(lastErr.trim()).message; expect(messageOutput).to.include(`Error: ${message}`); }); - it("when disableErrorLoggingTraceback is set to true, should not log stacktrace", () => { - const message = "Test error with traceback disabled"; + it("when disableErrorLoggingStacktrace is set to true, should not include stacktrace in error logs", () => { + const message = "Test error with stacktrace disabled"; setGlobalOptions({ - disableErrorLoggingTraceback: true, + disableErrorLoggingStacktrace: true, }); logger.error(message); expectStderr({ @@ -240,5 +250,9 @@ describe("logger", () => { message: message, }); }); + + afterEach(() => { + setGlobalOptions(defaultOptions); + }); }); }); diff --git a/src/logger/index.ts b/src/logger/index.ts index 280b164ff..f11d7fb71 100644 --- a/src/logger/index.ts +++ b/src/logger/index.ts @@ -161,7 +161,7 @@ function entryFromArgs(severity: LogSeverity, args: any[]): LogEntry { let message = format(...args); if ( severity === "ERROR" && - !getGlobalOptions().disableErrorLoggingTraceback && + !getGlobalOptions().disableErrorLoggingStacktrace && !args.find((arg) => arg instanceof Error) ) { message = new Error(message).stack || message; diff --git a/src/v2/options.ts b/src/v2/options.ts index f230c397d..b8deda445 100644 --- a/src/v2/options.ts +++ b/src/v2/options.ts @@ -234,13 +234,13 @@ export interface GlobalOptions { preserveExternalChanges?: boolean; /** - * Controls whether error logging should include the traceback of the error automatically. + * Controls whether error logging should include the stacktrace of the error automatically. * Defaults to false. * * @remarks - * When true, the error message will include not include the traceback of the error. + * When true, the error message will not include the stacktrace of the error. */ - disableErrorLoggingTraceback?: boolean; + disableErrorLoggingStacktrace?: boolean; } let globalOptions: GlobalOptions | undefined; From 0b3e9164f7708d0bc0881318fbcc398e3c1c582b Mon Sep 17 00:00:00 2001 From: Corie Watson Date: Wed, 9 Jul 2025 10:35:32 +0100 Subject: [PATCH 4/5] feat: add default behaviour test --- spec/logger.spec.ts | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/spec/logger.spec.ts b/spec/logger.spec.ts index 0b023ab09..da77dd775 100644 --- a/spec/logger.spec.ts +++ b/spec/logger.spec.ts @@ -228,6 +228,18 @@ describe("logger", () => { setGlobalOptions(defaultOptions); }); + afterEach(() => { + setGlobalOptions(defaultOptions); + }); + + it("default behavior is to include stacktrace in error logs", () => { + // If this test fails, it means there's a breaking change. + const message = "Test error with stacktrace"; + logger.error(message); + const messageOutput = JSON.parse(lastErr.trim()).message; + expect(messageOutput).to.include(`Error: ${message}`); + }); + it("when disableErrorLoggingStacktrace is set to false, should include stacktrace in error logs", () => { const message = "Test error with stacktrace"; setGlobalOptions({ @@ -250,9 +262,5 @@ describe("logger", () => { message: message, }); }); - - afterEach(() => { - setGlobalOptions(defaultOptions); - }); }); }); From 17f89c7b9fa68818183909e048d09bc3404a14ba Mon Sep 17 00:00:00 2001 From: Corie Watson Date: Wed, 9 Jul 2025 10:37:34 +0100 Subject: [PATCH 5/5] fix: duplicate getGlobalOptions --- src/logger/index.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/logger/index.ts b/src/logger/index.ts index 3373af8cb..f11d7fb71 100644 --- a/src/logger/index.ts +++ b/src/logger/index.ts @@ -25,7 +25,6 @@ import { traceContext } from "../common/trace"; import { CONSOLE_SEVERITY, UNPATCHED_CONSOLE } from "./common"; import { getGlobalOptions } from "../v2/options"; -import { getGlobalOptions } from "../v2/options"; /** * `LogSeverity` indicates the detailed severity of the log entry. See [LogSeverity](https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry#logseverity).