diff --git a/.changeset/tame-rocks-nail.md b/.changeset/tame-rocks-nail.md new file mode 100644 index 000000000000..9081750eb2ca --- /dev/null +++ b/.changeset/tame-rocks-nail.md @@ -0,0 +1,5 @@ +--- +"wrangler": patch +--- + +Only write Wrangler logs to a debug file if `WRANGLER_LOG=debug` is set, or a custom path is provided via `WRANGLER_LOG_PATH` diff --git a/packages/wrangler/src/__tests__/friendly-validator-errors.test.ts b/packages/wrangler/src/__tests__/friendly-validator-errors.test.ts index 96c5fe73bf2f..b4fd2c9322e7 100644 --- a/packages/wrangler/src/__tests__/friendly-validator-errors.test.ts +++ b/packages/wrangler/src/__tests__/friendly-validator-errors.test.ts @@ -46,7 +46,8 @@ describe("helpIfErrorIsSizeOrScriptStartup", () => { expect(std).toMatchInlineSnapshot(` Object { - "debug": "An error occurred while trying to locally profile the Worker: Error: workerd profiling failed", + "debug": "🪵 Writing logs to \\"/Users/penalosa/.wrangler/logs/wrangler-2025-10-07_23-25-03_725.log\\" + An error occurred while trying to locally profile the Worker: Error: workerd profiling failed", "err": "", "info": "", "out": "", diff --git a/packages/wrangler/src/__tests__/metrics.test.ts b/packages/wrangler/src/__tests__/metrics.test.ts index 9eca509c280a..8dc6241f2755 100644 --- a/packages/wrangler/src/__tests__/metrics.test.ts +++ b/packages/wrangler/src/__tests__/metrics.test.ts @@ -95,7 +95,10 @@ describe("metrics", () => { await Promise.all(dispatcher.requests); expect(requests.count).toBe(1); expect(std.debug).toMatchInlineSnapshot( - `"Metrics dispatcher: Posting data {\\"deviceId\\":\\"f82b1f46-eb7b-4154-aa9f-ce95f23b2288\\",\\"event\\":\\"some-event\\",\\"timestamp\\":1733961600000,\\"properties\\":{\\"category\\":\\"Workers\\",\\"wranglerVersion\\":\\"1.2.3\\",\\"os\\":\\"foo:bar\\",\\"a\\":1,\\"b\\":2}}"` + ` + "🪵 Writing logs to \\"/Users/penalosa/.wrangler/logs/wrangler-2025-10-07_23-25-03_753.log\\" + Metrics dispatcher: Posting data {\\"deviceId\\":\\"f82b1f46-eb7b-4154-aa9f-ce95f23b2288\\",\\"event\\":\\"some-event\\",\\"timestamp\\":1733961600000,\\"properties\\":{\\"category\\":\\"Workers\\",\\"wranglerVersion\\":\\"1.2.3\\",\\"os\\":\\"foo:bar\\",\\"a\\":1,\\"b\\":2}}" + ` ); expect(std.out).toMatchInlineSnapshot(`""`); expect(std.warn).toMatchInlineSnapshot(`""`); diff --git a/packages/wrangler/src/__tests__/utils/log-file.test.ts b/packages/wrangler/src/__tests__/utils/log-file.test.ts index 4048c27222b2..666c60495cbb 100644 --- a/packages/wrangler/src/__tests__/utils/log-file.test.ts +++ b/packages/wrangler/src/__tests__/utils/log-file.test.ts @@ -1,9 +1,12 @@ import { existsSync, readdirSync, readFileSync } from "node:fs"; import { join } from "node:path"; import { beforeEach, describe, expect, it, vi } from "vitest"; +import { logger } from "../../logger"; import { appendToDebugLogFile, debugLogFilepath } from "../../utils/log-file"; import { runInTempDir } from "../helpers/run-in-tmp"; +vi.mock("../../utils/log-file", { spy: true }); + describe("appendToDebugLogFile", () => { runInTempDir(); @@ -63,6 +66,28 @@ describe("appendToDebugLogFile", () => { expect(logContent).toContain(plainMessage); }); + it("should not write to log file with default log path & non debug level", async () => { + vi.stubEnv("WRANGLER_LOG_PATH", ""); + const plainMessage = "This is a random plain log message"; + + logger.info(plainMessage); + + expect(vi.mocked(appendToDebugLogFile).mock.calls.length).toBe(0); + }); + + it("should write to log file with default path & debug level", async () => { + vi.stubEnv("WRANGLER_LOG_PATH", ""); + + vi.stubEnv("WRANGLER_LOG", "debug"); + const plainMessage = "This is a debug log message"; + + logger.info(plainMessage); + + expect(vi.mocked(appendToDebugLogFile).mock.calls.length).toBeGreaterThan( + 0 + ); + }); + it("should handle multiline messages with ANSI codes", async () => { const multilineMessageWithAnsi = "\u001b[31mLine 1 with color\u001b[0m\nLine 2 plain\n\u001b[32mLine 3 with different color\u001b[0m"; diff --git a/packages/wrangler/src/logger.ts b/packages/wrangler/src/logger.ts index 7ad078378199..f96a346ced6e 100644 --- a/packages/wrangler/src/logger.ts +++ b/packages/wrangler/src/logger.ts @@ -152,9 +152,16 @@ export class Logger { ? this.formatMessage(messageLevel, format(...args)) : args; - // unless in unit-tests, send ALL logs to the debug log file (even non-debug logs for context & order) - const inUnitTests = typeof vitest !== "undefined"; - if (!inUnitTests) { + if ( + // only send logs to the debug log file if either + // - `WRANGLER_LOG_PATH` has been set by the user (and is not the default) + // - the configured log level is debug + // Even though we send non debug logs to the log file, we shouldn't overwhelm the user's + // system with loads of needless log files. There's very little value in non debug log files + process.env.WRANGLER_LOG_PATH || + this.loggerLevel === "debug" + ) { + // send ALL logs to the debug log file (even non-debug logs for context & order) void appendToDebugLogFile(messageLevel, message); }