import winston from 'winston';
// Define log levels
const levels = {
error: 0,
warn: 1,
info: 2,
http: 3,
debug: 4,
};
// Define colors for each level
const colors = {
error: 'red',
warn: 'yellow',
info: 'green',
http: 'magenta',
debug: 'white',
};
// Add colors
winston.addColors(colors);
// Get log level from environment or default to 'info'
const level = process.env.LOG_LEVEL || 'info';
// Define format
const format = winston.format.combine(
winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss:ms' }),
winston.format.colorize({ all: true }),
winston.format.printf(
(info) => `${info.timestamp} ${info.level}: ${info.message}`
)
);
// Define transports
const transports = [
// Console transport
new winston.transports.Console(),
// Add file transport for production environment
...(process.env.NODE_ENV === 'production'
? [
new winston.transports.File({
filename: 'logs/error.log',
level: 'error',
}),
new winston.transports.File({ filename: 'logs/combined.log' }),
]
: []),
];
// Create the logger
export const logger = winston.createLogger({
level,
levels,
format,
transports,
});
// Export a stream object for Morgan middleware
export const stream = {
write: (message: string) => {
logger.http(message.trim());
},
};