File size: 2,521 Bytes
80d4bc1 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 |
import winston from 'winston';
import DailyRotateFile from 'winston-daily-rotate-file';
import chalk from 'chalk';
const { combine, timestamp, printf, colorize, errors, json } = winston.format;
// Define log levels
const levels = {
error: 0,
warn: 1,
info: 2,
http: 3,
debug: 4,
};
// Colors for different log levels
const colors = {
error: 'red',
warn: 'yellow',
info: 'green',
http: 'magenta',
debug: 'white',
};
// Add colors to winston
winston.addColors(colors);
// Custom log format for console
const consoleFormat = printf(({ level, message, timestamp, stack, label }) => {
let color;
switch (level) {
case 'error': color = chalk.red.bold; break;
case 'warn': color = chalk.yellow; break;
case 'info': color = chalk.green; break;
case 'http': color = chalk.magenta; break;
case 'debug': color = chalk.blue; break;
default: color = chalk.white;
}
let logMessage = `${chalk.gray(timestamp)} ${color(`[${level.toUpperCase()}]`)}`;
if (label) {
logMessage += ` ${chalk.cyan(`(${label})`)}`;
}
logMessage += `: ${message}`;
if (stack) {
logMessage += `\n${chalk.red(stack)}`;
}
return logMessage;
});
// Custom log format for files
const fileFormat = combine(
errors({ stack: true }),
timestamp(),
json()
);
// Create transports array
const transports = [
new winston.transports.Console({
format: combine(
colorize({ level: true }),
timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
errors({ stack: true }),
consoleFormat
),
}),
new DailyRotateFile({
filename: 'logs/error-%DATE%.log',
datePattern: 'YYYY-MM-DD',
zippedArchive: true,
maxSize: '20m',
maxFiles: '14d',
level: 'error',
format: fileFormat,
}),
new DailyRotateFile({
filename: 'logs/combined-%DATE%.log',
datePattern: 'YYYY-MM-DD',
zippedArchive: true,
maxSize: '20m',
maxFiles: '14d',
format: fileFormat,
}),
];
// Create the logger instance
const logger = winston.createLogger({
level: process.env.LOG_LEVEL || 'info',
levels,
format: combine(
timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
errors({ stack: true })
),
transports,
exitOnError: false,
});
// Create a child logger with default metadata
export const createLogger = (label: string) => {
return logger.child({ label });
};
// Stream for morgan HTTP logging
export const httpLogStream = {
write: (message: string) => {
logger.http(message.trim());
},
};
export default logger; |