import fs from 'fs' import colors, { Color } from 'colors' import { NextApiRequest } from 'next' import { IncomingMessage } from 'http' colors.enable() export type LoggingTypes = 'system' | 'info.green' | 'info.cyan' | 'debug' | 'post' | 'warn' | 'error' | [string, keyof Color] let started: boolean = false export async function logStartup() { await fs.promises.stat('log').catch(async () => { await fs.promises.mkdir('log') await logging(`Created 'log' Folder.`, ['info.cyan', 'system']) }) started = true } export async function logging(message: string, types: LoggingTypes[], req?: NextApiRequest | IncomingMessage) { if (!started) await logStartup() let messages = { console: message, file: message } types.slice().reverse().forEach(async (type) => { switch (type) { case 'system': messages.console = '[SYSTEM] '.green + messages.console messages.file = '[SYSTEM] ' + messages.file break case 'info.green': messages.console = '[INFO] '.green + messages.console messages.file = '[INFO] ' + messages.file break case 'info.cyan': messages.console = '[INFO] '.cyan + messages.console messages.file = '[INFO] ' + messages.file break case 'debug': messages.console = '[Debug] '.grey + messages.console messages.file = '[Debug] ' + messages.file break case 'post': messages.console = '[POST] ' + messages.console messages.file = '[POST] ' + messages.file break case 'warn': messages.console = '[WARN] '.yellow + messages.console messages.file = '[WARN] ' + messages.file break case 'error': messages.console = '[ERROR] '.red + messages.console messages.file = '[ERROR] ' + messages.file break default: messages.console = `[${type[0]}] `[type[1]] + messages.console messages.file = `[${type[0]}] ` + messages.file break } }) messages.console = `[${new Date().toString().slice(0, 33)}] ` + messages.console messages.file = `[${new Date().toString().slice(0, 33)}] ` + messages.file if (req) { const forwardedFor: any = req.headers['x-forwarded-for'] const ip = (forwardedFor || '127.0.0.1, 192.168.178.1').split(',') messages.console = ip[0].yellow + ' - ' + messages.console messages.file = ip[0] + ' - ' + messages.file } await fs.promises.appendFile('log/log.txt', messages.file + '\n') console.log(messages.console) }