Stryker-SC/Discord-Bot-VCMaster-JavaScript-Revamped
0
1const winston = require('winston');2require('winston-daily-rotate-file');3const fs = require('fs');4const path = require('path');5 6// Ensure logs directory exists only if not in production to save disk IO on ephemeral environments7let logDir;8if (process.env.NODE_ENV !== 'production') {9 logDir = path.join(__dirname, '../logs');10 if (!fs.existsSync(logDir)) {11 fs.mkdirSync(logDir);12 }13}14 15const logFormat = winston.format.combine(16 winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),17 winston.format.printf(({ timestamp, level, message, ...meta }) => {18 let metaStr = Object.keys(meta).length ? JSON.stringify(meta) : '';19 return `[${timestamp}] [${level.toUpperCase()}]: ${message} ${metaStr}`;20 })21);22 23const consoleFormat = winston.format.combine(24 winston.format.colorize(),25 winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),26 winston.format.printf(({ timestamp, level, message, ...meta }) => {27 let metaStr = Object.keys(meta).length ? JSON.stringify(meta) : '';28 return `[${timestamp}] [${level}]: ${message} ${metaStr}`;29 })30);31 32const transports = [33 new winston.transports.Console({34 format: consoleFormat35 })36];37 38// Append file transports only in development/local environments39if (process.env.NODE_ENV !== 'production') {40 transports.push(new winston.transports.DailyRotateFile({41 filename: path.join(logDir, 'app-%DATE%.log'),42 datePattern: 'YYYY-MM-DD',43 maxSize: '20m',44 maxFiles: '14d',45 format: logFormat46 }));47 48 transports.push(new winston.transports.DailyRotateFile({49 filename: path.join(logDir, 'error-%DATE%.log'),50 datePattern: 'YYYY-MM-DD',51 level: 'error',52 maxSize: '20m',53 maxFiles: '14d',54 format: logFormat55 }));56}57 58const logger = winston.createLogger({59 level: 'info',60 transports: transports61});62 63module.exports = logger;64 