import winston from 'winston';
import chalk from 'chalk';
const { combine, timestamp, printf, colorize } = winston.format;
// Custom format for console output
const consoleFormat = printf(({ level, message, timestamp, ...meta }) => {
let msg = `${timestamp} [${level}]: ${message}`;
if (Object.keys(meta).length > 0) {
msg += ` ${JSON.stringify(meta)}`;
}
return msg;
});
// Create logger instance
export const logger = winston.createLogger({
level: process.env.LOG_LEVEL || 'info',
format: combine(
timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
winston.format.errors({ stack: true }),
winston.format.json()
),
transports: [
// Console transport
new winston.transports.Console({
format: combine(
colorize(),
timestamp({ format: 'HH:mm:ss' }),
consoleFormat
)
}),
// File transport for errors
new winston.transports.File({
filename: 'error.log',
level: 'error',
format: combine(
timestamp(),
winston.format.json()
)
}),
// File transport for all logs
new winston.transports.File({
filename: 'combined.log',
format: combine(
timestamp(),
winston.format.json()
)
})
]
});
// Add console methods for colored output
export const console = {
log: (msg) => console.log(chalk.white(msg)),
info: (msg) => console.log(chalk.cyan(msg)),
success: (msg) => console.log(chalk.green(msg)),
warning: (msg) => console.log(chalk.yellow(msg)),
error: (msg) => console.log(chalk.red(msg))
};