import { LogTransport, LogTransportInterface, LogRecord } from '@frontmcp/sdk';
@LogTransport({
name: 'StructuredJsonTransport',
description: 'Writes JSONL log records to stdout',
})
export class StructuredJsonTransport extends LogTransportInterface {
log(rec: LogRecord): void {
try {
const payload = {
ts: rec.timestamp.toISOString(),
level: rec.levelName, // e.g. INFO
levelValue: rec.level, // numeric
prefix: rec.prefix || undefined,
msg: stringify(rec.message),
args: rec.args?.map(stringify),
};
// Avoid console formatting; write raw line
process.stdout.write(JSON.stringify(payload) + '\n');
} catch (err) {
// Never throw from a transport
}
}
}
function stringify(x: unknown) {
if (x instanceof Error) {
return { name: x.name, message: x.message, stack: x.stack };
}
try {
return typeof x === 'string' ? x : JSON.parse(JSON.stringify(x));
} catch {
return String(x);
}
}