import type { ReportItemWithContext } from '../types'; import { Transport, TransportOptions } from '../Transport'; interface ConsoleTransportOptions extends TransportOptions { /** log 前缀 * @default '[Merlin Log]' */ prefix?: string; /** 格式化详情 */ parser?: (record: ReportItemWithContext>) => any; /** 输出使用的 Console 方法 * @default 'log' */ method?: 'log' | 'info'; } export class ConsoleTransport extends Transport { private prefix = '[Merlin Log]'; private parser: ((record: ReportItemWithContext>) => any) | null = null; private method: 'log' | 'info' = 'log'; constructor(options?: ConsoleTransportOptions) { super({ // 默认立刻输出 flushInterval: 0, bufferSize: 0, ...options, }); if (options?.prefix) { this.prefix = options.prefix; } if (options?.parser) { this.parser = options.parser; } if (options?.method) { this.method = options.method; } } print(...args: Parameters) { if (this.method === 'info') { console.info(...args); } else { console.log(...args); } } send(records: ReportItemWithContext>[]) { records.forEach((record) => { if (this.parser) { this.print(`${this.prefix}[${record.type}]${new Date(record.ctime).toLocaleString()}`, this.parser(record)); } else { this.print( `${this.prefix}[${record.type}]${new Date(record.ctime).toLocaleString()}`, record.context, record.data, ); } }); } }