Major additions: onboarding tour system, correlation-id middleware, media error handler, restore script, env validation script, Dockerignore files. Updates across 70+ admin components for improved UX and error handling. Bunker Admin
49 lines
1.5 KiB
TypeScript
49 lines
1.5 KiB
TypeScript
import winston from 'winston';
|
|
import { env } from '../config/env';
|
|
|
|
const consoleFormat = winston.format.combine(
|
|
winston.format.colorize(),
|
|
winston.format.printf(({ timestamp, level, message, ...meta }) => {
|
|
const metaStr = Object.keys(meta).length ? ` ${JSON.stringify(meta)}` : '';
|
|
return `${timestamp} [${level}]: ${message}${metaStr}`;
|
|
})
|
|
);
|
|
|
|
const transports: winston.transport[] = [new winston.transports.Console()];
|
|
|
|
export const logger = winston.createLogger({
|
|
level: env.NODE_ENV === 'production' ? 'info' : 'debug',
|
|
format: winston.format.combine(
|
|
winston.format.timestamp(),
|
|
winston.format.errors({ stack: true }),
|
|
env.NODE_ENV === 'production'
|
|
? winston.format.json()
|
|
: consoleFormat
|
|
),
|
|
transports,
|
|
});
|
|
|
|
// Add file transport in production (dynamic import to avoid breaking dev when not installed)
|
|
if (env.NODE_ENV === 'production') {
|
|
import('winston-daily-rotate-file').then((mod) => {
|
|
const DailyRotateFile = mod.default;
|
|
logger.add(
|
|
new DailyRotateFile({
|
|
dirname: env.LOG_DIR,
|
|
filename: 'api-%DATE%.log',
|
|
datePattern: 'YYYY-MM-DD',
|
|
maxSize: '20m',
|
|
maxFiles: '14d',
|
|
zippedArchive: true,
|
|
format: winston.format.combine(
|
|
winston.format.timestamp(),
|
|
winston.format.errors({ stack: true }),
|
|
winston.format.json(),
|
|
),
|
|
})
|
|
);
|
|
}).catch(() => {
|
|
logger.warn('winston-daily-rotate-file not installed, file logging disabled');
|
|
});
|
|
}
|