2022-05-05 07:57:51 +08:00
|
|
|
import * as db from "../init/db";
|
2022-03-27 23:29:11 +08:00
|
|
|
import chalk from "chalk";
|
|
|
|
import winston, { format } from "winston";
|
|
|
|
import { resolve } from "path";
|
2022-04-24 07:37:05 +08:00
|
|
|
import { ObjectId } from "mongodb";
|
2022-03-27 23:29:11 +08:00
|
|
|
|
|
|
|
const errorColor = chalk.red.bold;
|
|
|
|
const warningColor = chalk.yellow.bold;
|
|
|
|
const successColor = chalk.green.bold;
|
|
|
|
const infoColor = chalk.white;
|
|
|
|
|
|
|
|
const logFolderPath = process.env.LOG_FOLDER_PATH ?? "./logs";
|
|
|
|
const maxLogSize = parseInt(process.env.LOG_FILE_MAX_SIZE ?? "10485760");
|
2021-09-10 00:41:13 +08:00
|
|
|
|
2022-03-04 23:25:24 +08:00
|
|
|
interface Log {
|
2022-03-27 23:29:11 +08:00
|
|
|
type?: string;
|
2022-03-04 23:25:24 +08:00
|
|
|
timestamp: number;
|
|
|
|
uid: string;
|
|
|
|
event: string;
|
|
|
|
message: string;
|
|
|
|
}
|
|
|
|
|
2022-03-27 23:29:11 +08:00
|
|
|
const customLevels = {
|
|
|
|
error: 0,
|
|
|
|
warning: 1,
|
|
|
|
info: 2,
|
|
|
|
success: 3,
|
|
|
|
};
|
|
|
|
|
|
|
|
const timestampFormat = format.timestamp({
|
|
|
|
format: "DD-MMM-YYYY HH:mm:ss.SSS",
|
|
|
|
});
|
|
|
|
|
|
|
|
const simpleOutputFormat = format.printf((log) => {
|
|
|
|
return `${log.timestamp}\t${log.level}: ${log.message}`;
|
|
|
|
});
|
|
|
|
|
|
|
|
const coloredOutputFormat = format.printf((log) => {
|
|
|
|
let color = infoColor;
|
|
|
|
|
|
|
|
switch (log.level) {
|
|
|
|
case "error":
|
|
|
|
color = errorColor;
|
|
|
|
break;
|
|
|
|
case "warning":
|
|
|
|
color = warningColor;
|
|
|
|
break;
|
|
|
|
case "success":
|
|
|
|
color = successColor;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
return `${log.timestamp}\t${color(log.message)}`;
|
|
|
|
});
|
|
|
|
|
|
|
|
const fileFormat = format.combine(timestampFormat, simpleOutputFormat);
|
|
|
|
|
|
|
|
const consoleFormat = format.combine(timestampFormat, coloredOutputFormat);
|
|
|
|
|
|
|
|
const logger = winston.createLogger({
|
|
|
|
levels: customLevels,
|
|
|
|
transports: [
|
|
|
|
new winston.transports.File({
|
|
|
|
level: "error",
|
|
|
|
filename: resolve(logFolderPath, "error.log"),
|
|
|
|
maxsize: maxLogSize,
|
|
|
|
format: fileFormat,
|
|
|
|
}),
|
|
|
|
new winston.transports.File({
|
|
|
|
level: "success",
|
|
|
|
filename: resolve(logFolderPath, "combined.log"),
|
|
|
|
maxsize: maxLogSize,
|
|
|
|
format: fileFormat,
|
|
|
|
}),
|
|
|
|
new winston.transports.Console({
|
|
|
|
level: "success",
|
|
|
|
format: consoleFormat,
|
|
|
|
}),
|
|
|
|
],
|
|
|
|
exceptionHandlers: [
|
|
|
|
new winston.transports.File({
|
|
|
|
filename: resolve(logFolderPath, "exceptions.log"),
|
|
|
|
format: fileFormat,
|
|
|
|
}),
|
|
|
|
],
|
|
|
|
});
|
|
|
|
|
|
|
|
const logToDb = async (
|
|
|
|
event: string,
|
|
|
|
message: any,
|
|
|
|
uid?: string
|
|
|
|
): Promise<void> => {
|
|
|
|
const logsCollection = db.collection<Log>("logs");
|
|
|
|
|
|
|
|
logger.info(`${event}\t${uid}\t${JSON.stringify(message)}`);
|
|
|
|
logsCollection.insertOne({
|
2022-04-24 07:37:05 +08:00
|
|
|
_id: new ObjectId(),
|
2022-03-27 23:29:11 +08:00
|
|
|
timestamp: Date.now(),
|
|
|
|
uid: uid ?? "",
|
|
|
|
event,
|
|
|
|
message,
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
const Logger = {
|
|
|
|
error: (message: string): winston.Logger => logger.error(message),
|
|
|
|
warning: (message: string): winston.Logger => logger.warning(message),
|
|
|
|
info: (message: string): winston.Logger => logger.info(message),
|
|
|
|
success: (message: string): winston.Logger => logger.log("success", message),
|
|
|
|
logToDb,
|
2021-09-10 00:41:13 +08:00
|
|
|
};
|
2022-03-27 23:29:11 +08:00
|
|
|
|
|
|
|
export default Logger;
|