From 04e1ba38044dafc6d454c21e6a082641585f34fa Mon Sep 17 00:00:00 2001 From: Kaushik Narayan R Date: Wed, 12 Mar 2025 15:22:49 -0700 Subject: [PATCH] removed log location detail --- api/axios.ts | 4 +- api/spotify.ts | 3 +- config/redis.ts | 3 +- config/sequelize.ts | 3 +- controllers/auth.ts | 3 +- controllers/operations.ts | 3 +- controllers/playlists.ts | 3 +- index.ts | 5 +- middleware/authCheck.ts | 3 +- models/index.ts | 3 +- utils/logger.ts | 109 +++++++++++++++++--------------------- validators/index.ts | 3 +- 12 files changed, 61 insertions(+), 84 deletions(-) diff --git a/api/axios.ts b/api/axios.ts index 0577b7a..0fc4d5e 100644 --- a/api/axios.ts +++ b/api/axios.ts @@ -1,9 +1,7 @@ // TODO: rate limit module is busted (CJS types), do something for rate limiting import axios, { type AxiosInstance } from "axios"; import { baseAPIURL, accountsAPIURL } from "../constants.ts"; -import curriedLogger from "../utils/logger.ts"; - -const logger = curriedLogger(import.meta.filename); +import logger from "../utils/logger.ts"; const authInstance: AxiosInstance = axios.create({ baseURL: accountsAPIURL, diff --git a/api/spotify.ts b/api/spotify.ts index 7c1e87a..06a99e8 100644 --- a/api/spotify.ts +++ b/api/spotify.ts @@ -1,5 +1,4 @@ import { axiosInstance } from "./axios.ts"; -import curriedLogger from "../utils/logger.ts"; import { type AxiosResponse, type AxiosRequestConfig } from "axios"; import type { @@ -14,7 +13,7 @@ import type { Res, } from "spotify_manager/index.d.ts"; -const logger = curriedLogger(import.meta.filename); +import logger from "../utils/logger.ts"; const logPrefix = "Spotify API: "; enum allowedMethods { diff --git a/config/redis.ts b/config/redis.ts index a054d06..06e9e50 100644 --- a/config/redis.ts +++ b/config/redis.ts @@ -1,8 +1,7 @@ import { createClient } from "redis"; import { sleep } from "../utils/flake.ts"; -import curriedLogger from "../utils/logger.ts"; -const logger = curriedLogger(import.meta.filename); +import logger from "../utils/logger.ts"; if (!process.env["REDIS_URI"]) throw new TypeError("Redis connection URI not defined"); diff --git a/config/sequelize.ts b/config/sequelize.ts index 8deddcc..78ecd20 100644 --- a/config/sequelize.ts +++ b/config/sequelize.ts @@ -1,7 +1,6 @@ import type { SequelizeOptions } from "sequelize-typescript"; -import curriedLogger from "../utils/logger.ts"; -const logger = curriedLogger(import.meta.filename); +import logger from "../utils/logger.ts"; type ConnConfigs = Record; diff --git a/controllers/auth.ts b/controllers/auth.ts index 2543364..96d8f3a 100644 --- a/controllers/auth.ts +++ b/controllers/auth.ts @@ -11,8 +11,7 @@ import type { RequestHandler } from "express"; import { generateRandString } from "../utils/generateRandString.ts"; -import curriedLogger from "../utils/logger.ts"; -const logger = curriedLogger(import.meta.filename); +import logger from "../utils/logger.ts"; /** * Stateful redirect to Spotify login with credentials diff --git a/controllers/operations.ts b/controllers/operations.ts index c733e8d..52afbf0 100644 --- a/controllers/operations.ts +++ b/controllers/operations.ts @@ -30,8 +30,7 @@ import { redisClient } from "../config/redis.ts"; import Playlists from "../models/playlists.ts"; import Links from "../models/links.ts"; -import curriedLogger from "../utils/logger.ts"; -const logger = curriedLogger(import.meta.filename); +import logger from "../utils/logger.ts"; /** * Sync user's Spotify data diff --git a/controllers/playlists.ts b/controllers/playlists.ts index 33c4ac6..3864562 100644 --- a/controllers/playlists.ts +++ b/controllers/playlists.ts @@ -9,8 +9,7 @@ import type { SimplifiedPlaylistObject, } from "spotify_manager/index.d.ts"; -import curriedLogger from "../utils/logger.ts"; -const logger = curriedLogger(import.meta.filename); +import logger from "../utils/logger.ts"; /** * Get user's playlists diff --git a/index.ts b/index.ts index 163552d..53ddd0a 100644 --- a/index.ts +++ b/index.ts @@ -22,8 +22,7 @@ import authRoutes from "./routes/auth.ts"; import playlistRoutes from "./routes/playlists.ts"; import operationRoutes from "./routes/operations.ts"; -import curriedLogger from "./utils/logger.ts"; -const logger = curriedLogger(import.meta.filename); +import logger from "./utils/logger.ts"; const app = express(); @@ -131,7 +130,7 @@ const cleanupFunc = (signal?: string) => { Promise.allSettled([ redisClient.disconnect, - seqConn.close(), + seqConn.close, promisify(server.close), ]).then(() => { logger.info("Cleaned up, exiting."); diff --git a/middleware/authCheck.ts b/middleware/authCheck.ts index 76a4e90..fe27183 100644 --- a/middleware/authCheck.ts +++ b/middleware/authCheck.ts @@ -3,8 +3,7 @@ import type { RequestHandler } from "express"; import { sessionName } from "../constants.ts"; -import curriedLogger from "../utils/logger.ts"; -const logger = curriedLogger(import.meta.filename); +import logger from "../utils/logger.ts"; export const isAuthenticated: RequestHandler = (req, res, next) => { if (req.session.accessToken) { diff --git a/models/index.ts b/models/index.ts index dfd2d32..f2a0875 100644 --- a/models/index.ts +++ b/models/index.ts @@ -6,8 +6,7 @@ import seqConfig from "../config/sequelize.ts"; import links from "./links.ts"; import playlists from "./playlists.ts"; -import curriedLogger from "../utils/logger.ts"; -const logger = curriedLogger(import.meta.filename); +import logger from "../utils/logger.ts"; if (!process.env["NODE_ENV"]) throw new TypeError("Node environment not defined"); diff --git a/utils/logger.ts b/utils/logger.ts index 6ceba79..6819442 100644 --- a/utils/logger.ts +++ b/utils/logger.ts @@ -2,75 +2,64 @@ import path from "path"; import { createLogger, transports, config, format, type Logger } from "winston"; -const { combine, label, timestamp, printf, errors } = format; +const { combine, timestamp, printf, errors } = format; -const getLabel = (callingModuleName: string) => { - if (!callingModuleName) return "repl"; - const parts = callingModuleName.split(path.sep); - return path.join( - parts[parts.length - 2] ?? "", - parts[parts.length - 1] ?? "" - ); -}; - -const allowedErrorKeys = ["name", "code", "message", "stack"]; - -const metaFormat = (meta: Record) => { +const metaFormat = (meta: object) => { + const disallowedKeySets = [{ type: Error, keys: ["stack"] }]; if (Object.keys(meta).length > 0) - return "\n" + JSON.stringify(meta, null, "\t"); + return ( + "\n" + + JSON.stringify( + meta, + Object.getOwnPropertyNames(meta).filter((key) => { + for (const pair of disallowedKeySets) { + if (meta instanceof pair.type) { + return !pair.keys.includes(key); + } + } + return true; + }), + "\t" + ) + ); return ""; }; const logFormat = printf(({ level, message, label, timestamp, ...meta }) => { - if (meta["error"]) { - const sanitizedError = Object.fromEntries( - Object.entries(meta["error"]).filter(([key]) => - allowedErrorKeys.includes(key) - ) - ); - - const { stack, ...rest } = sanitizedError; + const errorObj: Error = meta["error"] as Error; + if (errorObj) { return ( - `${timestamp} [${label}] ${level}: ${message}${metaFormat(rest)}\n` + - `${stack ?? ""}` + `${timestamp} [${level.toUpperCase()}]: ${message}${metaFormat( + errorObj + )}\n` + `${errorObj["stack"] ?? ""}` ); } - return `${timestamp} [${label}] ${level}: ${message}${metaFormat(meta)}`; + return `${timestamp} [${level.toUpperCase()}]: ${message}${metaFormat(meta)}`; }); -const loggerCache = new Map>(); +const winstonLogger: Logger = createLogger({ + levels: config.npm.levels, + format: combine( + errors({ stack: true }), + timestamp({ format: "YYYY-MM-DD HH:mm:ss" }), + logFormat + ), + transports: [ + new transports.Console({ level: "info" }), + new transports.File({ + filename: path.join(import.meta.dirname, "..", "logs", "debug.log"), + level: "debug", + maxsize: 10485760, + }), + new transports.File({ + filename: path.join(import.meta.dirname, "..", "logs", "error.log"), + level: "error", + maxsize: 1048576, + }), + ], +}); +winstonLogger.on("error", (error) => + winstonLogger.error("Error inside logger", { error }) +); -const curriedLogger = (callingModuleName: string): Logger => { - if (loggerCache.has(callingModuleName)) { - return loggerCache.get(callingModuleName)!; - } - const winstonLogger = createLogger({ - levels: config.npm.levels, - format: combine( - errors({ stack: true }), - label({ label: getLabel(callingModuleName) }), - timestamp({ format: "YYYY-MM-DD HH:mm:ss" }), - logFormat - ), - transports: [ - new transports.Console({ level: "info" }), - new transports.File({ - filename: import.meta.dirname + "/../logs/debug.log", - level: "debug", - maxsize: 10485760, - }), - new transports.File({ - filename: import.meta.dirname + "/../logs/error.log", - level: "error", - maxsize: 1048576, - }), - ], - }); - winstonLogger.on("error", (error) => - winstonLogger.error("Error inside logger", { error }) - ); - loggerCache.set(callingModuleName, winstonLogger); - return winstonLogger; -}; - -export default curriedLogger; +export default winstonLogger; diff --git a/validators/index.ts b/validators/index.ts index 3748792..57dd775 100644 --- a/validators/index.ts +++ b/validators/index.ts @@ -4,8 +4,7 @@ import type { RequestHandler } from "express"; import { getNestedValuesString } from "../utils/jsonTransformer.ts"; -import curriedLogger from "../utils/logger.ts"; -const logger = curriedLogger(import.meta.filename); +import logger from "../utils/logger.ts"; /** Refer: https://stackoverflow.com/questions/58848625/access-messages-in-express-validator */ export const validate: RequestHandler = (req, res, next) => {