import path from "path"; import { createLogger, format, Logger, transports } from "winston"; import DailyRotateFile from "winston-daily-rotate-file"; import DiscordTransport from "winston-discord-transport"; export default class AppLogger { private static Loggers: Logger[] = []; public static InitialiseLogger(service: string): Logger { const customFormat = format.printf(({ level, message, timestamp, label }) => { return `${timestamp} [${label}] ${level}: ${message}`; }); const logger = createLogger({ level: "verbose", format: format.combine( format.timestamp({ format: "YYYY-MM-DD HH:mm:ss" }), format.errors({ stack: true }), format.splat(), customFormat, ), defaultMeta: { service }, transports: [], }); const logDir = path.join(process.env.LOG_DIR!); logger.add(new DailyRotateFile({ filename: "%DATE%.log", dirname: logDir, datePattern: "YYYY-MM-DD-HH", maxSize: "20m", maxFiles: "14d", level: "info", })); logger.add(new transports.Console({ format: format.combine( format.colorize(), format.timestamp(), customFormat, )})); logger.add(new DiscordTransport({ webhook: process.env.LOG_DISCORD_WEBHOOK!, defaultMeta: { service: service }, level: "info", })); AppLogger.Loggers.push(logger); return logger; } public static LogError(service: string, label: string, message: string) { const logger = AppLogger.Loggers.find(x => x.defaultMeta!.service == service) ?? AppLogger.InitialiseLogger(service); logger.error({ service, label, message }); } public static LogWarn(service: string, label: string, message: string) { const logger = AppLogger.Loggers.find(x => x.defaultMeta!.service == service) ?? AppLogger.InitialiseLogger(service); logger.warn({ service, label, message }); } public static LogInfo(service: string, label: string, message: string) { const logger = AppLogger.Loggers.find(x => x.defaultMeta!.service == service) ?? AppLogger.InitialiseLogger(service); logger.info({ service, label, message }); } public static LogVerbose(service: string, label: string, message: string) { const logger = AppLogger.Loggers.find(x => x.defaultMeta!.service == service) ?? AppLogger.InitialiseLogger(service); logger.verbose({ service, label, message }); } }