diff --git a/src/app.ts b/src/app.ts index ae6e069..05e134b 100644 --- a/src/app.ts +++ b/src/app.ts @@ -4,6 +4,7 @@ import cors from "cors"; import morgan from "morgan"; import { errorHandler } from "./middleware/error.middleware.js"; +import { logger } from "./utils/logger.js"; import authRoutes from "./routes/auth.routes.js"; import productRoutes from "./routes/product.routes.js"; import orderRoutes from "./routes/order.routes.js"; @@ -15,7 +16,10 @@ const app: Application = express(); //global middleware app.use(cors()); app.use(express.json()); -app.use(morgan("dev")); + +// HTTP request logging with morgan +const morganFormat = ":method :url :status :res[content-length] - :response-time ms"; +app.use(morgan(morganFormat, { stream: logger.stream })); // health check route app.get("/health", (req, res) => { diff --git a/src/utils/logger.ts b/src/utils/logger.ts index 91894b4..c67156f 100644 --- a/src/utils/logger.ts +++ b/src/utils/logger.ts @@ -1,13 +1,33 @@ type LogMeta = Record; -function format(level: string, message: string, meta?: LogMeta) { +type LogLevel = "debug" | "info" | "warn" | "error" | "http"; + +const LOG_COLORS: Record = { + debug: "\x1b[36m", // cyan + info: "\x1b[32m", // green + warn: "\x1b[33m", // yellow + error: "\x1b[31m", // red + http: "\x1b[35m", // magenta +}; + +const RESET = "\x1b[0m"; + +function format(level: LogLevel, message: string, meta?: LogMeta): string { const timestamp = new Date().toISOString(); - return meta - ? `[${timestamp}] ${level.toUpperCase()} ${message} ${JSON.stringify(meta)}` - : `[${timestamp}] ${level.toUpperCase()} ${message}`; + const color = LOG_COLORS[level]; + const levelStr = `${color}${level.toUpperCase().padEnd(5)}${RESET}`; + + const baseLog = `[${timestamp}] ${levelStr} ${message}`; + return meta ? `${baseLog} ${JSON.stringify(meta)}` : baseLog; } export const logger = { + debug(message: string, meta?: LogMeta) { + if (process.env.NODE_ENV !== "production") { + console.log(format("debug", message, meta)); + } + }, + info(message: string, meta?: LogMeta) { console.log(format("info", message, meta)); }, @@ -19,4 +39,16 @@ export const logger = { error(message: string, meta?: LogMeta) { console.error(format("error", message, meta)); }, + + http(message: string, meta?: LogMeta) { + console.log(format("http", message, meta)); + }, + + // Stream for morgan integration + stream: { + write(message: string) { + // Remove trailing newline from morgan + logger.http(message.trim()); + }, + }, };