Skip to content

Commit 99a4a7d

Browse files
committed
refactor: enhance Inngest logging configuration and improve error handling in client and server loggers
1 parent f41fe72 commit 99a4a7d

File tree

5 files changed

+126
-32
lines changed

5 files changed

+126
-32
lines changed

hooks/use-logger.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
"use client";
22

33
import { useMemo } from "react";
4+
import type { LogContext, Logger } from "@/lib/logger";
45
import { logger as clientLogger, createLogger } from "@/lib/logger/client";
5-
import type { LogContext, Logger } from "@/lib/logger/index";
66

77
/**
88
* React hook for component-level logging.

lib/inngest/client.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
import "server-only";
22
import { Inngest } from "inngest";
3+
import { createLogger } from "@/lib/logger/server";
34

4-
// Configure a logger for Inngest functions. Defaults to console in all envs.
5+
// Configure a logger for Inngest functions.
6+
// Our unified logger supports Inngest's standardized interface via flexible child() implementation.
57
// https://www.inngest.com/docs/guides/logging
6-
const logger = console;
8+
const logger = createLogger({ source: "inngest" });
79

810
export const inngest = new Inngest({
911
id: "domainstack",

lib/logger/client.ts

Lines changed: 57 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
"use client";
22

3-
import { getOrGenerateClientCorrelationId } from "@/lib/logger/correlation";
43
import {
54
createLogEntry,
65
formatLogEntry,
76
type LogContext,
87
type Logger,
98
type LogLevel,
109
shouldLog,
11-
} from "@/lib/logger/index";
10+
} from "@/lib/logger";
11+
import { getOrGenerateClientCorrelationId } from "@/lib/logger/correlation";
1212

1313
/**
1414
* Client-side logger with PostHog integration.
@@ -86,16 +86,25 @@ class ClientLogger implements Logger {
8686
private logWithError(
8787
level: LogLevel,
8888
message: string,
89-
error?: Error | unknown,
89+
errorOrContext?: unknown,
9090
context?: LogContext,
9191
): void {
9292
if (!shouldLog(level, this.minLevel)) {
9393
return;
9494
}
9595

96+
// Determine error and context based on number of arguments:
97+
// - 3 args: error(message, error, context) - traditional call
98+
// - 2 args: error(message, context) - flexible call for compatibility
99+
const error = context !== undefined ? errorOrContext : undefined;
100+
const finalContext =
101+
context !== undefined
102+
? context
103+
: (errorOrContext as LogContext | undefined);
104+
96105
try {
97106
const entry = createLogEntry(level, message, {
98-
context,
107+
context: finalContext,
99108
error,
100109
correlationId: this.correlationId,
101110
});
@@ -107,7 +116,7 @@ class ClientLogger implements Logger {
107116

108117
// Track errors in PostHog
109118
if ((level === "error" || level === "fatal") && error instanceof Error) {
110-
this.trackErrorInPostHog(error, context);
119+
this.trackErrorInPostHog(error, finalContext);
111120
}
112121
} catch (err) {
113122
// Logging should never crash the application
@@ -150,12 +159,20 @@ class ClientLogger implements Logger {
150159
this.log("warn", message, context);
151160
}
152161

153-
error(message: string, error?: Error | unknown, context?: LogContext): void {
154-
this.logWithError("error", message, error, context);
162+
error(message: string, error: unknown, context?: LogContext): void;
163+
error(message: string, context?: LogContext): void;
164+
error(message: string, errorOrContext?: unknown, context?: LogContext): void {
165+
this.logWithError("error", message, errorOrContext, context);
155166
}
156167

157-
fatal(message: string, error?: Error | unknown, context?: LogContext): void {
158-
this.logWithError("fatal", message, error, context);
168+
fatal(message: string, error: unknown, context?: LogContext): void;
169+
fatal(message: string, context?: LogContext): void;
170+
fatal(message: string, errorOrContext?: unknown, context?: LogContext): void {
171+
this.logWithError("fatal", message, errorOrContext, context);
172+
}
173+
174+
child(context: LogContext): Logger {
175+
return createLogger(context);
159176
}
160177
}
161178

@@ -188,7 +205,7 @@ export const logger = new ClientLogger();
188205
* ```
189206
*/
190207
export function createLogger(baseContext: LogContext): Logger {
191-
return {
208+
const childLogger = {
192209
trace: (message: string, context?: LogContext) =>
193210
logger.trace(message, { ...baseContext, ...context }),
194211
debug: (message: string, context?: LogContext) =>
@@ -197,9 +214,35 @@ export function createLogger(baseContext: LogContext): Logger {
197214
logger.info(message, { ...baseContext, ...context }),
198215
warn: (message: string, context?: LogContext) =>
199216
logger.warn(message, { ...baseContext, ...context }),
200-
error: (message: string, error?: Error | unknown, context?: LogContext) =>
201-
logger.error(message, error, { ...baseContext, ...context }),
202-
fatal: (message: string, error?: Error | unknown, context?: LogContext) =>
203-
logger.fatal(message, error, { ...baseContext, ...context }),
217+
error: (
218+
message: string,
219+
errorOrContext?: unknown,
220+
context?: LogContext,
221+
) => {
222+
if (context !== undefined) {
223+
// Three args: error(message, error, context)
224+
logger.error(message, errorOrContext, { ...baseContext, ...context });
225+
} else {
226+
// Two args: could be error(message, error) or error(message, context)
227+
logger.error(message, errorOrContext, baseContext);
228+
}
229+
},
230+
fatal: (
231+
message: string,
232+
errorOrContext?: unknown,
233+
context?: LogContext,
234+
) => {
235+
if (context !== undefined) {
236+
// Three args: fatal(message, error, context)
237+
logger.fatal(message, errorOrContext, { ...baseContext, ...context });
238+
} else {
239+
// Two args: could be fatal(message, error) or fatal(message, context)
240+
logger.fatal(message, errorOrContext, baseContext);
241+
}
242+
},
243+
child: (context: LogContext) =>
244+
createLogger({ ...baseContext, ...context }),
204245
};
246+
247+
return childLogger as Logger;
205248
}

lib/logger/index.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,14 @@ export interface Logger {
3737
debug(message: string, context?: LogContext): void;
3838
info(message: string, context?: LogContext): void;
3939
warn(message: string, context?: LogContext): void;
40-
error(message: string, error?: Error | unknown, context?: LogContext): void;
41-
fatal(message: string, error?: Error | unknown, context?: LogContext): void;
40+
// Overloaded signatures for flexible error/fatal logging
41+
// Pattern 1: error(message, error, context) - traditional with error object
42+
error(message: string, error: unknown, context?: LogContext): void;
43+
// Pattern 2: error(message, context) - compatible with various logging interfaces
44+
error(message: string, context?: LogContext): void;
45+
fatal(message: string, error: unknown, context?: LogContext): void;
46+
fatal(message: string, context?: LogContext): void;
47+
child(context: LogContext): Logger;
4248
}
4349

4450
// ============================================================================

lib/logger/server.ts

Lines changed: 56 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import {
99
type LogLevel,
1010
parseLogLevel,
1111
shouldLog,
12-
} from "@/lib/logger/index";
12+
} from "@/lib/logger";
1313

1414
/**
1515
* Server-side logger with OpenTelemetry integration.
@@ -139,19 +139,28 @@ class ServerLogger implements Logger {
139139
private logWithError(
140140
level: LogLevel,
141141
message: string,
142-
error?: Error | unknown,
142+
errorOrContext?: unknown,
143143
context?: LogContext,
144144
): void {
145145
if (!shouldLog(level, this.minLevel)) {
146146
return;
147147
}
148148

149+
// Determine error and context based on number of arguments:
150+
// - 3 args: error(message, error, context) - traditional call
151+
// - 2 args: error(message, context) - flexible call for compatibility
152+
const error = context !== undefined ? errorOrContext : undefined;
153+
const finalContext =
154+
context !== undefined
155+
? context
156+
: (errorOrContext as LogContext | undefined);
157+
149158
try {
150159
const { traceId, spanId } = getTraceContext();
151160
const correlationId = getCorrelationId();
152161

153162
const entry = createLogEntry(level, message, {
154-
context,
163+
context: finalContext,
155164
error,
156165
correlationId,
157166
traceId,
@@ -173,7 +182,7 @@ class ServerLogger implements Logger {
173182

174183
// Track critical errors in PostHog (async, non-blocking)
175184
if ((level === "error" || level === "fatal") && error instanceof Error) {
176-
this.trackErrorInPostHog(error, context, correlationId);
185+
this.trackErrorInPostHog(error, finalContext, correlationId);
177186
}
178187
} catch (err) {
179188
// Logging should never crash the application
@@ -221,12 +230,20 @@ class ServerLogger implements Logger {
221230
this.log("warn", message, context);
222231
}
223232

224-
error(message: string, error?: Error | unknown, context?: LogContext): void {
225-
this.logWithError("error", message, error, context);
233+
error(message: string, error: unknown, context?: LogContext): void;
234+
error(message: string, context?: LogContext): void;
235+
error(message: string, errorOrContext?: unknown, context?: LogContext): void {
236+
this.logWithError("error", message, errorOrContext, context);
237+
}
238+
239+
fatal(message: string, error: unknown, context?: LogContext): void;
240+
fatal(message: string, context?: LogContext): void;
241+
fatal(message: string, errorOrContext?: unknown, context?: LogContext): void {
242+
this.logWithError("fatal", message, errorOrContext, context);
226243
}
227244

228-
fatal(message: string, error?: Error | unknown, context?: LogContext): void {
229-
this.logWithError("fatal", message, error, context);
245+
child(context: LogContext): Logger {
246+
return createLogger(context);
230247
}
231248
}
232249

@@ -259,7 +276,7 @@ export const logger = new ServerLogger();
259276
* ```
260277
*/
261278
export function createLogger(baseContext: LogContext): Logger {
262-
return {
279+
const childLogger = {
263280
trace: (message: string, context?: LogContext) =>
264281
logger.trace(message, { ...baseContext, ...context }),
265282
debug: (message: string, context?: LogContext) =>
@@ -268,9 +285,35 @@ export function createLogger(baseContext: LogContext): Logger {
268285
logger.info(message, { ...baseContext, ...context }),
269286
warn: (message: string, context?: LogContext) =>
270287
logger.warn(message, { ...baseContext, ...context }),
271-
error: (message: string, error?: Error | unknown, context?: LogContext) =>
272-
logger.error(message, error, { ...baseContext, ...context }),
273-
fatal: (message: string, error?: Error | unknown, context?: LogContext) =>
274-
logger.fatal(message, error, { ...baseContext, ...context }),
288+
error: (
289+
message: string,
290+
errorOrContext?: unknown,
291+
context?: LogContext,
292+
) => {
293+
if (context !== undefined) {
294+
// Three args: error(message, error, context)
295+
logger.error(message, errorOrContext, { ...baseContext, ...context });
296+
} else {
297+
// Two args: could be error(message, error) or error(message, context)
298+
logger.error(message, errorOrContext, baseContext);
299+
}
300+
},
301+
fatal: (
302+
message: string,
303+
errorOrContext?: unknown,
304+
context?: LogContext,
305+
) => {
306+
if (context !== undefined) {
307+
// Three args: fatal(message, error, context)
308+
logger.fatal(message, errorOrContext, { ...baseContext, ...context });
309+
} else {
310+
// Two args: could be fatal(message, error) or fatal(message, context)
311+
logger.fatal(message, errorOrContext, baseContext);
312+
}
313+
},
314+
child: (context: LogContext) =>
315+
createLogger({ ...baseContext, ...context }),
275316
};
317+
318+
return childLogger as Logger;
276319
}

0 commit comments

Comments
 (0)