relv-space4 / src /utils /logger.ts
relv-dev's picture
Deploy latest verified Turnitin worker
521a9b6 verified
Raw
History Blame Contribute Delete
1.72 kB
/** Structured logger with worker context */
type LogLevel = 'info' | 'warn' | 'error' | 'debug';
interface LogEntry {
level: LogLevel;
ts: string;
worker?: string;
job?: string;
account?: string;
step?: string;
msg: string;
[key: string]: unknown;
}
let globalWorkerId = 'unknown';
export function setWorkerId(id: string): void {
globalWorkerId = id;
}
function write(level: LogLevel, msg: string, extra?: Record<string, unknown>): void {
const entry: LogEntry = {
level,
ts: new Date().toISOString(),
worker: globalWorkerId,
msg,
...extra,
};
const line = JSON.stringify(entry);
if (level === 'error') {
process.stderr.write(line + '\n');
} else {
process.stdout.write(line + '\n');
}
}
export const logger = {
info: (msg: string, extra?: Record<string, unknown>) => write('info', msg, extra),
warn: (msg: string, extra?: Record<string, unknown>) => write('warn', msg, extra),
error: (msg: string, extra?: Record<string, unknown>) => write('error', msg, extra),
debug: (msg: string, extra?: Record<string, unknown>) => write('debug', msg, extra),
/** Create a child logger with preset context fields */
child(context: Record<string, unknown>) {
return {
info: (msg: string, extra?: Record<string, unknown>) =>
write('info', msg, { ...context, ...extra }),
warn: (msg: string, extra?: Record<string, unknown>) =>
write('warn', msg, { ...context, ...extra }),
error: (msg: string, extra?: Record<string, unknown>) =>
write('error', msg, { ...context, ...extra }),
debug: (msg: string, extra?: Record<string, unknown>) =>
write('debug', msg, { ...context, ...extra }),
};
},
};