diff --git a/.changeset/chilly-bears-invent.md b/.changeset/chilly-bears-invent.md new file mode 100644 index 000000000000..a30135c3f25f --- /dev/null +++ b/.changeset/chilly-bears-invent.md @@ -0,0 +1,7 @@ +--- +"wrangler": patch +--- + +fix: spread tail messages when logging + +Logged messages (via console, etc) would previously be logged as an array of values. This spreads it when logging to match what is expected. diff --git a/packages/wrangler/src/__tests__/tail.test.ts b/packages/wrangler/src/__tests__/tail.test.ts index 94e5390cd130..257fa2f8abbd 100644 --- a/packages/wrangler/src/__tests__/tail.test.ts +++ b/packages/wrangler/src/__tests__/tail.test.ts @@ -293,6 +293,55 @@ describe("tail", () => { `); }); + it("logs console messages and exceptions", async () => { + const api = mockWebsocketAPIs(); + await runWrangler("tail test-worker"); + + const event = generateMockRequestEvent(); + const message = generateMockEventMessage({ + event, + logs: [ + { message: ["some string"], level: "log", timestamp: 1234561 }, + { + message: [{ complex: "object" }], + level: "log", + timestamp: 1234562, + }, + { message: [1234], level: "error", timestamp: 1234563 }, + ], + exceptions: [ + { name: "Error", message: "some error", timestamp: 1234564 }, + { name: "Error", message: { complex: "error" }, timestamp: 1234564 }, + ], + }); + const serializedMessage = serialize(message); + + api.ws.send(serializedMessage); + expect( + std.out + .replace( + new Date(mockEventTimestamp).toLocaleString(), + "[mock event timestamp]" + ) + .replace( + mockTailExpiration.toLocaleString(), + "[mock expiration date]" + ) + ).toMatchInlineSnapshot(` + "successfully created tail, expires at [mock expiration date] + Connected to test-worker, waiting for logs... + GET https://example.org/ - Ok @ [mock event timestamp] + (log) some string + (log) { complex: 'object' } + (error) 1234" + `); + expect(std.err).toMatchInlineSnapshot(` + " Error: some error + Error: { complex: 'error' }" + `); + expect(std.warn).toMatchInlineSnapshot(`""`); + }); + it("logs scheduled messages in pretty format", async () => { const api = mockWebsocketAPIs(); await runWrangler("tail test-worker --format pretty"); diff --git a/packages/wrangler/src/tail/index.ts b/packages/wrangler/src/tail/index.ts index 3e8aa4978594..02abe833dc79 100644 --- a/packages/wrangler/src/tail/index.ts +++ b/packages/wrangler/src/tail/index.ts @@ -161,7 +161,7 @@ export type TailEventMessage = { * Any logs sent out by the worker */ logs: { - message: unknown; + message: unknown[]; level: string; // TODO: make this a union of possible values timestamp: number; }[]; diff --git a/packages/wrangler/src/tail/printing.ts b/packages/wrangler/src/tail/printing.ts index 86b34d3eb468..0f7327f72a1c 100644 --- a/packages/wrangler/src/tail/printing.ts +++ b/packages/wrangler/src/tail/printing.ts @@ -24,7 +24,7 @@ export function prettyPrintLogs(data: WebSocket.RawData): void { if (eventMessage.logs.length > 0) { eventMessage.logs.forEach(({ level, message }) => { - console.log(` (${level})`, message); + console.log(` (${level})`, ...message); }); }