From 9516b60d93e45b4985b79229de186f8324374f3d Mon Sep 17 00:00:00 2001 From: Stephan <57194608+stephan418@users.noreply.github.com> Date: Wed, 27 Apr 2022 17:00:36 +0200 Subject: [PATCH] Add logger using winston + Add formats + Add debug and error log files --- src/Middleware/error/handler.ts | 3 +++ src/Middleware/error/logger.ts | 39 +++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 src/Middleware/error/logger.ts diff --git a/src/Middleware/error/handler.ts b/src/Middleware/error/handler.ts index d182f19..33f3448 100644 --- a/src/Middleware/error/handler.ts +++ b/src/Middleware/error/handler.ts @@ -1,6 +1,7 @@ import { PrismaClientUnknownRequestError } from "@prisma/client/runtime"; import { NextFunction, Request, Response } from "express"; import ForwardableError from "./ForwardableError"; +import logger from "./logger"; const env = process.env.NODE_ENV || "production"; @@ -20,6 +21,8 @@ export default function defaultErrorHandler(err: any, req: Request, res: Respons } if (err instanceof PrismaClientUnknownRequestError) { + logger.warning(err); + return res.status(404).json({ type: "error", payload: { diff --git a/src/Middleware/error/logger.ts b/src/Middleware/error/logger.ts new file mode 100644 index 0000000..184f5f7 --- /dev/null +++ b/src/Middleware/error/logger.ts @@ -0,0 +1,39 @@ +import winston, { createLogger } from "winston"; + +const { + format: { printf, colorize, combine, timestamp, json, errors, prettyPrint }, +} = winston; + +const defaultJsonFormat = combine(errors({ stack: true }), timestamp(), json({ space: 2 })); + +const customCLIFormat = printf(({ level, message, label, timestamp, stack }) => { + let output = `${level}${stack ? `(1/2:message)` : ""} at ${timestamp}${label ? ` (#${label})` : ""}: ${message}\n`; + + if (stack) { + output += `\n${level}(2/2:stack)${label ? ` (#${label})` : ""}: ${stack}\n\n`; + } + + return output; +}); + +export default createLogger({ + levels: winston.config.syslog.levels, + format: combine(errors({ stack: true }), timestamp()), + transports: [ + new winston.transports.Console({ + level: "debug", + format: combine(timestamp(), colorize(), customCLIFormat), + }), + new winston.transports.File({ + filename: "/app/error.log", + level: "error", + format: defaultJsonFormat, + }), + new winston.transports.File({ + level: "debug", + filename: "/app/debug.log", + format: defaultJsonFormat, + silent: !(process.env.NODE_ENV === "development"), // Silent when not in development + }), + ], +});