import { WriteStream, createWriteStream, PathLike } from 'fs'; import { promisify } from 'util'; export class Logger { logFile: WriteStream; errorFile: WriteStream; write: (log: string) => Promise; writeError: (log: string) => Promise; constructor({ filePath }: { filePath: PathLike }) { this.logFile = createWriteStream(filePath); this.errorFile = createWriteStream(`${filePath}.err`); this.write = promisify(this.logFile.write.bind(this.logFile)); this.writeError = promisify(this.errorFile.write.bind(this.logFile)); const gracefulShutdown = () => { this.close(); process.exit(0); }; process.on('SIGINT', gracefulShutdown); process.on('SIGTERM', gracefulShutdown); } log(...args: (string | object | number)[]) { console.log(...args); return Promise.all(args.map((arg) => this.write(`${JSON.stringify(arg)}\n`))); } error(...args: (string | object | number)[]) { console.error(...args); return Promise.all( args.map((arg) => Promise.all([ this.write(`${typeof arg === 'object' ? JSON.stringify(arg) : arg}\n`), this.writeError(`${typeof arg === 'object' ? JSON.stringify(arg) : arg}\n`), ]), ), ); } close() { this.logFile.close(); this.errorFile.close(); console.log(`Logfile available at ${this.logFile.path.toString()}`); } }