const fs = require("fs");
|
const path = require("path");
|
const winston = require("winston");
|
const DailyRotateFile = require("winston-daily-rotate-file");
|
const config = require("./config");
|
|
function resolveLogDir() {
|
const dirFromConfig = (config.log && config.log.dir) || "logs";
|
const appRoot = process.pkg
|
? path.dirname(process.execPath)
|
: path.resolve(__dirname, "..");
|
return path.isAbsolute(dirFromConfig)
|
? dirFromConfig
|
: path.resolve(appRoot, dirFromConfig);
|
}
|
|
const logDir = resolveLogDir();
|
try {
|
if (!fs.existsSync(logDir)) {
|
fs.mkdirSync(logDir, { recursive: true });
|
}
|
} catch (_) {}
|
|
const logLevel = (config.log && config.log.level) || "info";
|
const enableFileLog = !config.log || config.log.toFile !== false;
|
|
const logFormat = winston.format.combine(
|
winston.format.timestamp({ format: "YYYY-MM-DD HH:mm:ss.SSS" }),
|
winston.format.errors({ stack: true }),
|
winston.format.printf((info) => {
|
const base = `[${info.timestamp}] [${info.level.toUpperCase()}] ${info.message}`;
|
const extra = { ...info };
|
delete extra.level;
|
delete extra.message;
|
delete extra.timestamp;
|
|
const hasExtra = Object.keys(extra).length > 0;
|
if (!hasExtra) return base;
|
try {
|
return `${base} ${JSON.stringify(extra)}`;
|
} catch (_) {
|
return base;
|
}
|
})
|
);
|
|
const transports = [
|
new winston.transports.Console({ level: logLevel })
|
];
|
|
if (enableFileLog) {
|
transports.push(
|
new DailyRotateFile({
|
level: logLevel,
|
dirname: logDir,
|
filename: "gateway-%DATE%.log",
|
datePattern: "YYYY-MM-DD",
|
maxSize: "50m",
|
maxFiles: "30d"
|
})
|
);
|
transports.push(
|
new DailyRotateFile({
|
level: "error",
|
dirname: logDir,
|
filename: "gateway-error-%DATE%.log",
|
datePattern: "YYYY-MM-DD",
|
maxSize: "50m",
|
maxFiles: "30d"
|
})
|
);
|
}
|
|
const baseLogger = winston.createLogger({
|
level: logLevel,
|
format: logFormat,
|
transports,
|
exitOnError: false
|
});
|
|
const logger = {
|
debug(message, extra) {
|
if (extra === undefined) baseLogger.debug(message);
|
else baseLogger.debug(message, extra);
|
},
|
info(message, extra) {
|
if (extra === undefined) baseLogger.info(message);
|
else baseLogger.info(message, extra);
|
},
|
warn(message, extra) {
|
if (extra === undefined) baseLogger.warn(message);
|
else baseLogger.warn(message, extra);
|
},
|
error(message, extra) {
|
if (extra === undefined) baseLogger.error(message);
|
else baseLogger.error(message, extra);
|
}
|
};
|
|
module.exports = logger;
|