78 lines
1.7 KiB
TypeScript
78 lines
1.7 KiB
TypeScript
import * as winston from 'winston';
|
|
import 'winston-daily-rotate-file';
|
|
import * as path from 'path';
|
|
|
|
// Define log levels
|
|
const levels = {
|
|
error: 0,
|
|
warn: 1,
|
|
info: 2,
|
|
http: 3,
|
|
debug: 4,
|
|
};
|
|
|
|
// Define log level based on environment
|
|
const level = () => {
|
|
const env = process.env.NODE_ENV || 'development';
|
|
return env === 'development' ? 'debug' : 'warn';
|
|
};
|
|
|
|
// Define colors for each level
|
|
const colors = {
|
|
error: 'red',
|
|
warn: 'yellow',
|
|
info: 'green',
|
|
http: 'magenta',
|
|
debug: 'blue',
|
|
};
|
|
|
|
// Add colors to winston
|
|
winston.addColors(colors);
|
|
|
|
// Custom format for logging
|
|
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 file transport options
|
|
const fileRotateTransport = new winston.transports.DailyRotateFile({
|
|
filename: path.join('logs', '%DATE%-server.log'),
|
|
datePattern: 'YYYY-MM-DD',
|
|
zippedArchive: true,
|
|
maxSize: '20m',
|
|
maxFiles: '14d',
|
|
format: winston.format.combine(
|
|
winston.format.uncolorize(),
|
|
winston.format.timestamp(),
|
|
winston.format.json()
|
|
),
|
|
});
|
|
|
|
// Create the logger
|
|
const logger = winston.createLogger({
|
|
level: level(),
|
|
levels,
|
|
format,
|
|
transports: [
|
|
new winston.transports.Console({
|
|
format: winston.format.combine(
|
|
winston.format.colorize(),
|
|
winston.format.simple()
|
|
),
|
|
}),
|
|
fileRotateTransport,
|
|
],
|
|
});
|
|
|
|
// Create a stream object for Morgan middleware
|
|
const stream = {
|
|
write: (message: string) => {
|
|
logger.http(message.trim());
|
|
},
|
|
};
|
|
|
|
export { logger, stream }; |