/** * Copyright 2023 Beijing VolcanoEngine Technology Ltd. * All Rights Reserved. */ import { format } from './format'; export type LogLevel = 'silent' | 'error' | 'warn' | 'verbose'; const typeToLevel: { [index in LogLevel]: number; } = { silent: 0, error: 1, warn: 2, verbose: 3, }; export interface LoggerConsumer { write(level: string, message: string): any; } const defaultConsumer: LoggerConsumer = { write(level, message) { switch (level) { case 'error': console.error(message); break; case 'warn': console.warn(message); break; default: console.log(message); } }, }; export class Logger { private levelIndex: number = 1; consumer = defaultConsumer; getLevelIndex = () => { return this.levelIndex; }; getConsumer = () => { return this.consumer; }; constructor(public readonly product: string) {} propagate(subProduct: string): Logger { const logger = new Logger(`${this.product}.${subProduct}`); logger.getLevelIndex = () => this.levelIndex; logger.getConsumer = () => this.consumer; return logger; } setLevel(level: LogLevel) { this.levelIndex = typeToLevel[level] || 1; } log(level: string, message: string, ...splats: any[]) { const str = format(message, ...splats); this.getConsumer().write(level, `[${this.product}] [${level}] ${str}`); } error(message: string, ...splats: any[]) { if (this.getLevelIndex() >= 1) { this.log('error', message, ...splats); } } warn(message: string, ...splats: any[]) { if (this.getLevelIndex() >= 2) { this.log('warn', message, ...splats); } } trace(message: string, ...splats: any[]) { if (this.getLevelIndex() >= 3) { this.log('trace', message, ...splats); } } }