| import winston from 'winston';
|
| import 'winston-daily-rotate-file';
|
| import path from 'path';
|
| import { fileURLToPath } from 'url';
|
|
|
| const __filename = fileURLToPath(import.meta.url);
|
| const __dirname = path.dirname(__filename);
|
|
|
|
|
| const levels = {
|
| error: 0,
|
| warn: 1,
|
| info: 2,
|
| debug: 3,
|
| };
|
|
|
|
|
| const colors = {
|
| error: 'red',
|
| warn: 'yellow',
|
| info: 'green',
|
| debug: 'blue',
|
| };
|
|
|
|
|
| winston.addColors(colors);
|
|
|
|
|
| const format = winston.format.combine(
|
| winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
|
| winston.format.json(),
|
| winston.format.prettyPrint()
|
| );
|
|
|
|
|
| function getTransports() {
|
| const isDev = process.env.NODE_ENV === 'development';
|
|
|
|
|
| if (!isDev) {
|
| return [
|
| new winston.transports.Console({
|
| level: 'error',
|
| format: winston.format.simple()
|
| })
|
| ];
|
| }
|
|
|
|
|
| return [
|
| new winston.transports.Console({
|
| format: winston.format.combine(
|
| winston.format.colorize(),
|
| winston.format.simple()
|
| )
|
| }),
|
| new winston.transports.DailyRotateFile({
|
| filename: path.join(__dirname, '../logs/error-%DATE%.log'),
|
| datePattern: 'YYYY-MM-DD',
|
| level: 'error',
|
| maxSize: '20m',
|
| maxFiles: '14d'
|
| }),
|
| new winston.transports.DailyRotateFile({
|
| filename: path.join(__dirname, '../logs/combined-%DATE%.log'),
|
| datePattern: 'YYYY-MM-DD',
|
| maxSize: '20m',
|
| maxFiles: '14d'
|
| })
|
| ];
|
| }
|
|
|
|
|
| const logger = winston.createLogger({
|
| levels,
|
| format,
|
| transports: getTransports()
|
| });
|
|
|
|
|
| export const log = (level, message, meta = {}) => {
|
|
|
| if (process.env.NODE_ENV !== 'development' && level !== 'error') {
|
| return;
|
| }
|
|
|
| logger.log(level, message, {
|
| timestamp: new Date().toISOString(),
|
| ...meta,
|
| });
|
| };
|
|
|
| export default logger;
|
|
|