export * from "./sinks.ts";export * from "./types.ts";
import { LogEntry, LogLevel, SinkFunction } from "./types.ts";import { parseLogEntry } from "./parser.ts";
export interface LoggerOptions { minimumLevel: LogLevel; outputFormat: string;}
export const textFormat = "[{timestamp} {level}] {message}";
export const jsonFormat = '{"message":"{message}","level":"{level}","timestamp":"{timestamp}","data":{params}}';
export function createLogger( { minimumLevel = LogLevel.DEBUG, outputFormat = textFormat, }: Partial<LoggerOptions> = {},): Logger { return new LoggerImpl({ minimumLevel, outputFormat, });}
export type LogFunction = (format: string, ...args: unknown[]) => void;
interface Sink { sinkFunc: SinkFunction; outputFormat: string;}
export interface Logger { addSink(sinkFunc: SinkFunction, outputFormat?: string): this;
debug: LogFunction; info: LogFunction; warn: LogFunction; error: LogFunction; critical: LogFunction;}
class LoggerImpl implements Logger { private readonly minimumLevel: LogLevel; private readonly outputFormat: string; private sinks: Sink[] = [];
constructor({ minimumLevel, outputFormat }: LoggerOptions) { this.minimumLevel = minimumLevel; this.outputFormat = outputFormat; }
addSink( sinkFunc: SinkFunction, outputFormat: string = this.outputFormat, ): this { this.sinks.push({ sinkFunc, outputFormat, }); return this; }
private log(level: LogLevel, format: string, ...args: unknown[]): void { if (level < this.minimumLevel) return;
if (this.sinks.length === 0) {
return; }
for (let sink of this.sinks) { const parsed = parseLogEntry( level, format, sink.outputFormat, ...args, ); sink.sinkFunc(parsed); } }
debug(format: string, ...args: unknown[]): void { this.log(LogLevel.DEBUG, format, ...args); }
info(format: string, ...args: unknown[]): void { this.log(LogLevel.INFO, format, ...args); }
warn(format: string, ...args: unknown[]): void { this.log(LogLevel.WARN, format, ...args); }
error(format: string, ...args: unknown[]): void { this.log(LogLevel.ERROR, format, ...args); }
critical(format: string, ...args: unknown[]): void { this.log(LogLevel.CRITICAL, format, ...args); }}