Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/tame-rocks-nail.md
Original file line number Diff line number Diff line change
@@ -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`
Original file line number Diff line number Diff line change
Expand Up @@ -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": "",
Expand Down
5 changes: 4 additions & 1 deletion packages/wrangler/src/__tests__/metrics.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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(`""`);
Expand Down
25 changes: 25 additions & 0 deletions packages/wrangler/src/__tests__/utils/log-file.test.ts
Original file line number Diff line number Diff line change
@@ -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();

Expand Down Expand Up @@ -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";
Expand Down
13 changes: 10 additions & 3 deletions packages/wrangler/src/logger.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

Expand Down
Loading