148 lines
4.5 KiB
JavaScript
148 lines
4.5 KiB
JavaScript
const { format } = require('winston');
|
|
const winston = require('winston');
|
|
const DailyRotateFile = require('winston-daily-rotate-file');
|
|
|
|
const logPrefix = (label) => {
|
|
if (label === 'server') {
|
|
return '[🖥️ \x1b[32mServer\x1b[0m] ';
|
|
} else if (label === 'client') {
|
|
return '[🌐 \x1b[34mClient\x1b[0m] ';
|
|
} else if (label === 'Internal-Server-Error') {
|
|
return '[❗️ \x1b[38;5;9mInternal-Error\x1b[0m] ';
|
|
} else if (label === 'Authentification') {
|
|
return '[🔒 \x1b[33mAuthentification\x1b[0m] ';
|
|
} else if (label === 'Suspicious Request') {
|
|
return '[⚠️ \x1b[38;5;208mSuspicious Request\x1b[0m] ';
|
|
}else if (label === 'API Request') {
|
|
return '[⚙️ \x1b[38;5;9mAPI Request\x1b[0m] ';
|
|
}
|
|
return '';
|
|
};
|
|
|
|
const createDailyRotateFileTransport = () => {
|
|
return new DailyRotateFile({
|
|
filename: 'logs/log-%DATE%.log',
|
|
datePattern: 'YYYY-MM-DD',
|
|
zippedArchive: false,
|
|
maxSize: '20m',
|
|
maxFiles: '14d'
|
|
});
|
|
};
|
|
|
|
const logger = winston.createLogger({
|
|
format: format.combine(
|
|
format.label({ label: 'server' }),
|
|
format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
|
|
format.printf(info => {
|
|
const { timestamp, level, label, message } = info;
|
|
const prefix = logPrefix(label);
|
|
return `${prefix}[\x1b[36m${timestamp}\x1b[0m] ${message}`;
|
|
})
|
|
),
|
|
transports: [
|
|
new winston.transports.Console(),
|
|
createDailyRotateFileTransport()
|
|
]
|
|
});
|
|
|
|
const ErrorLogger = winston.createLogger({
|
|
format: format.combine(
|
|
format.label({ label: 'Internal-Server-Error' }),
|
|
format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
|
|
format.printf(info => {
|
|
const { timestamp, level, label, message } = info;
|
|
const prefix = logPrefix(label);
|
|
return `${prefix}[\x1b[36m${timestamp}\x1b[0m] ${message}`;
|
|
})
|
|
),
|
|
transports: [
|
|
new winston.transports.Console(),
|
|
createDailyRotateFileTransport()
|
|
]
|
|
});
|
|
|
|
const clientLogger = winston.createLogger({
|
|
format: format.combine(
|
|
format.label({ label: 'client' }),
|
|
format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
|
|
format.printf(info => {
|
|
const { timestamp, level, label, message } = info;
|
|
const prefix = logPrefix(label);
|
|
return `${prefix}[\x1b[36m${timestamp}\x1b[0m] ${message}`;
|
|
})
|
|
),
|
|
transports: [
|
|
new winston.transports.Console(),
|
|
createDailyRotateFileTransport()
|
|
]
|
|
});
|
|
|
|
const authLogger = winston.createLogger({
|
|
format: format.combine(
|
|
format.label({ label: 'Authentification' }),
|
|
format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
|
|
format.printf(info => {
|
|
const { timestamp, level, label, message } = info;
|
|
const prefix = logPrefix(label);
|
|
return `${prefix}[\x1b[36m${timestamp}\x1b[0m] ${message}`;
|
|
})
|
|
),
|
|
transports: [
|
|
new winston.transports.Console(),
|
|
createDailyRotateFileTransport()
|
|
]
|
|
});
|
|
|
|
const suspiciousLogger = winston.createLogger({
|
|
format: format.combine(
|
|
format.label({ label: 'Suspicious Request' }),
|
|
format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
|
|
format.printf(info => {
|
|
const { timestamp, level, label, message } = info;
|
|
const prefix = logPrefix(label);
|
|
return `${prefix}[\x1b[36m${timestamp}\x1b[0m] ${message}`;
|
|
})
|
|
),
|
|
transports: [
|
|
new winston.transports.Console(),
|
|
createDailyRotateFileTransport()
|
|
]
|
|
});
|
|
|
|
const logRequestInfo = (req, res, next) => {
|
|
const ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress;
|
|
const userAgent = req.headers['user-agent'];
|
|
req.log = clientLogger;
|
|
req.log.info(`[${ip}] - ${userAgent} - ${req.method} ${req.url}`);
|
|
next();
|
|
};
|
|
|
|
const apiLogger = winston.createLogger({
|
|
format: format.combine(
|
|
format.label({ label: 'API Request' }),
|
|
format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
|
|
format.printf(info => {
|
|
const { timestamp, level, label, message } = info;
|
|
const prefix = logPrefix(label);
|
|
return `${prefix}[\x1b[36m${timestamp}\x1b[0m] ${message}`;
|
|
})
|
|
),
|
|
transports: [
|
|
new winston.transports.Console(),
|
|
createDailyRotateFileTransport()
|
|
]
|
|
});
|
|
|
|
const logApiRequest = (req, res, next) => {
|
|
const start = Date.now();
|
|
res.on('finish', () => {
|
|
const duration = Date.now() - start;
|
|
const ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress;
|
|
apiLogger.info(`[${ip}] - ${req.method} ${req.originalUrl} - ${res.statusCode} - ${duration}ms`);
|
|
});
|
|
next();
|
|
};
|
|
|
|
|
|
module.exports = { logger, clientLogger, ErrorLogger, logRequestInfo, authLogger, suspiciousLogger, logApiRequest };
|