| import winston from 'winston'; |
| import morgan from 'morgan'; |
| import fs from 'fs'; |
| import path from 'path'; |
| import { fileURLToPath } from 'url'; |
|
|
| const __filename = fileURLToPath(import.meta.url); |
| const __dirname = path.dirname(__filename); |
|
|
| |
| const LOG_DIR = path.join(__dirname, '..', '..', 'logs'); |
| if (!fs.existsSync(LOG_DIR)) { |
| fs.mkdirSync(LOG_DIR, { recursive: true }); |
| } |
|
|
| |
| const { combine, timestamp, printf, colorize } = winston.format; |
|
|
| |
| const consoleFormat = combine( |
| colorize({ all: true }), |
| timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }), |
| printf(({ level, message, timestamp }) => { |
| return `${timestamp} [${level}]: ${message}`; |
| }) |
| ); |
|
|
| |
| const fileFormat = combine( |
| timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }), |
| printf(({ level, message, timestamp }) => { |
| return `${timestamp} [${level}]: ${message}`; |
| }) |
| ); |
|
|
|
|
| const customLevels = { |
| levels: { |
| error: 0, |
| warn: 1, |
| info: 2, |
| http: 3, |
| debug: 4, |
| raw: 5 |
| }, |
| colors: { |
| error: 'red', |
| warn: 'yellow', |
| info: 'green', |
| http: 'cyan', |
| debug: 'blue', |
| raw: 'magenta' |
| } |
| }; |
|
|
| |
| const level = 'raw'; |
|
|
| |
| const logger = winston.createLogger({ |
| levels: customLevels.levels, |
| level, |
| format: fileFormat, |
| transports: [ |
| |
| new winston.transports.File({ |
| filename: path.join(LOG_DIR, 'combined.log'), |
| maxsize: 5242880, |
| maxFiles: 5 |
| }), |
| |
| new winston.transports.File({ |
| filename: path.join(LOG_DIR, 'http.log'), |
| level: 'http', |
| maxsize: 5242880, |
| maxFiles: 5 |
| }), |
| |
| new winston.transports.File({ |
| filename: path.join(LOG_DIR, 'error.log'), |
| level: 'error', |
| maxsize: 5242880, |
| maxFiles: 5 |
| }), |
| |
| new winston.transports.File({ |
| filename: path.join(LOG_DIR, 'raw-responses.log'), |
| level: 'raw', |
| maxsize: 5242880, |
| maxFiles: 5 |
| }), |
| |
| new winston.transports.Console({ |
| format: consoleFormat |
| }) |
| ] |
| }); |
|
|
| |
| winston.addColors(customLevels.colors); |
|
|
| |
| const morganStream = { |
| write: (message) => { |
| |
| logger.http(message.trim()); |
| } |
| }; |
|
|
| |
| const morganFormat = ':remote-addr :method :url :status :res[content-length] - :response-time ms'; |
|
|
| |
| const httpLogger = morgan(morganFormat, { stream: morganStream }); |
|
|
| |
| export const logHttpRequest = httpLogger; |
|
|
| |
| export const logInfo = (message) => logger.info(message); |
| export const logError = (message, error) => { |
| if (error) { |
| logger.error(`${message}: ${error.message}`); |
| logger.error(error.stack); |
| } else { |
| logger.error(message); |
| } |
| }; |
| export const logWarn = (message) => logger.warn(message); |
| export const logDebug = (message) => logger.debug(message); |
| export const logRaw = (message) => logger.raw(message); |
| export const logHttp = (message) => logger.http(message); |
|
|
| export default { |
| logHttpRequest, |
| logInfo, |
| logError, |
| logWarn, |
| logDebug, |
| logRaw, |
| logHttp |
| }; |