92 lines
2.3 KiB
TypeScript
92 lines
2.3 KiB
TypeScript
import rTracer from "cls-rtracer";
|
|
import dotenv from "dotenv";
|
|
import path from "path";
|
|
import { createLogger, format, transports } from "winston";
|
|
import DailyRotateFile from "winston-daily-rotate-file";
|
|
|
|
dotenv.config();
|
|
|
|
const initLogger = () => {
|
|
const isProduction = process.env.NODE_ENV === "production";
|
|
|
|
const consoleFormat = format.combine(
|
|
format.colorize(),
|
|
format.timestamp(),
|
|
format.align(),
|
|
format.splat(),
|
|
format.errors({ stack: !isProduction }),
|
|
format.printf((info) => {
|
|
const rid = rTracer.id();
|
|
|
|
let out =
|
|
isProduction && rid
|
|
? `${info.timestamp} [request-id:${rid}] - ${info.level}: [${info.label}]: ${info.message}`
|
|
: `${info.timestamp} - ${info.level}: [${info.label}]: ${info.message}`;
|
|
|
|
if (info.metadata?.error) {
|
|
out = `${out} ${info.metadata.error}`;
|
|
if (info.metadata?.error?.stack) {
|
|
out = `${out} ${info.metadata.error.stack}`;
|
|
}
|
|
}
|
|
|
|
return out;
|
|
})
|
|
);
|
|
|
|
const fileFormat = format.combine(
|
|
format.timestamp(),
|
|
format.splat(),
|
|
format.label({ label: path.basename(String(require.main?.filename)) }),
|
|
//format.metadata(),
|
|
format.metadata({ fillExcept: ["message", "level", "timestamp", "label"] }),
|
|
format.simple(),
|
|
format.json()
|
|
);
|
|
|
|
const logger = createLogger({
|
|
level: isProduction ? "error" : "debug",
|
|
|
|
format: fileFormat,
|
|
|
|
transports: [
|
|
new DailyRotateFile({
|
|
dirname: isProduction ? "/logs" : ".",
|
|
filename: "error-%DATE%.log",
|
|
datePattern: "YYYY-MM-DD",
|
|
utc: true,
|
|
level: "error",
|
|
maxSize: "5m",
|
|
maxFiles: "1d",
|
|
}),
|
|
new DailyRotateFile({
|
|
dirname: isProduction ? "/logs" : ".",
|
|
filename: "debug-%DATE%.log",
|
|
datePattern: "YYYY-MM-DD",
|
|
utc: true,
|
|
level: "debug",
|
|
maxSize: "5m",
|
|
maxFiles: "1d",
|
|
}),
|
|
],
|
|
});
|
|
|
|
//
|
|
// If we're not in production then log to the `console` with the format:
|
|
// `${info.level}: ${info.message} JSON.stringify({ ...rest }) `
|
|
//
|
|
//if (!config.isProduction) {
|
|
logger.add(
|
|
new transports.Console({
|
|
format: consoleFormat,
|
|
level: "debug",
|
|
})
|
|
);
|
|
//}
|
|
|
|
return logger;
|
|
};
|
|
|
|
const logger = initLogger();
|
|
export { logger };
|