88 lines
2.8 KiB
TypeScript
Raw Normal View History

2024-01-03 16:10:59 +01:00
import { createLogger, format, transports, Logger, LeveledLogMethod, addColors } from "winston";
import "winston-daily-rotate-file";
import * as dotenv from "dotenv";
import { inspect } from "util";
import { isEmptyObject } from "@/src/helpers/general";
dotenv.config();
const consolelogFormat = format.printf(({ level, message, version, timestamp }) => {
return `${timestamp} [${version}] ${level}: ${message}`;
});
const consolelogFormat2 = format.printf(info => {
if (!isEmptyObject(info.metadata)) {
return `${info.timestamp} [${info.version}] ${info.level}: ${info.message} ${inspect(info.metadata, {
showHidden: false,
depth: null,
colors: true
})}`;
}
return `${info.timestamp} [${info.version}] ${info.level}: ${info.message}`;
});
const fileFormat = format.combine(format.uncolorize(), format.timestamp(), format.json());
const errorLog = new transports.DailyRotateFile({
filename: "logs/error.log",
format: fileFormat,
level: "error",
datePattern: "YYYY-MM-DD"
});
const combinedLog = new transports.DailyRotateFile({
filename: "logs/combined.log",
format: fileFormat,
datePattern: "YYYY-MM-DD"
});
const consoleLog = new transports.Console({
format: format.combine(
format.colorize(),
format.timestamp({ format: "YYYY-MM-DDTHH:mm:ss:SSS" }), // uses local timezone
format.errors({ stack: true }),
format.align(),
format.metadata({ fillExcept: ["message", "level", "timestamp", "version"] }),
consolelogFormat2
)
});
const transportOptions = process.env.LOG_FILES === "true" ? [consoleLog, errorLog, combinedLog] : [consoleLog];
//possible log levels: { fatal: 0, error: 1, warn: 2, info: 3, http: 4, debug: 5, trace: 6 },
const logLevels = {
levels: {
fatal: 0,
error: 1,
warn: 2,
info: 3,
http: 4,
debug: 5,
trace: 6
},
colors: {
fatal: "red",
error: "red",
warn: "yellow",
info: "green",
http: "green",
debug: "magenta",
trace: "cyan"
}
};
export const logger = createLogger({
levels: logLevels.levels,
level: process.env.LOG_LEVEL,
defaultMeta: { version: process.env.npm_package_version },
transports: transportOptions
}) as Logger & Record<keyof typeof logLevels.levels, LeveledLogMethod>;
addColors(logLevels.colors);
export function registerLogFileCreationListener() {
errorLog.on("new", filename => logger.info(`Using error log file: ${filename}`));
combinedLog.on("new", filename => logger.info(`Using combined log file: ${filename}`));
errorLog.on("rotate", filename => logger.info(`Rotated error log file: ${filename}`));
combinedLog.on("rotate", filename => logger.info(`Rotated combined log file: ${filename}`));
}