From ce11b1f57e6370d6d682a39f93d73d31907168ac Mon Sep 17 00:00:00 2001 From: Blake Matthes Date: Fri, 7 Mar 2025 13:39:53 -0600 Subject: [PATCH] feat(logger): added transport to post to db instead of file --- server/services/logger/dbTransport.ts | 29 ++++++++++++++++++++ server/services/logger/logger.ts | 38 +++++++++++++-------------- 2 files changed, 47 insertions(+), 20 deletions(-) create mode 100644 server/services/logger/dbTransport.ts diff --git a/server/services/logger/dbTransport.ts b/server/services/logger/dbTransport.ts new file mode 100644 index 0000000..9eaf61e --- /dev/null +++ b/server/services/logger/dbTransport.ts @@ -0,0 +1,29 @@ +import {db} from "../../../database/dbclient.js"; +import {logs} from "../../../database/schema/logs.js"; +import build from "pino-abstract-transport"; + +type Log = { + username: string | null; + service: string; + level: string; + msg: string; +}; +// Create a custom transport function +export default async function (log: Log) { + //const {username, service, level, msg, ...extra} = log; + try { + return build(async function (source) { + for await (let obj of source) { + // Insert log entry into the PostgreSQL database using Drizzle ORM + await db.insert(logs).values({ + level: obj.level, + username: obj?.username, + service: obj?.service, + message: obj.msg, + }); + } + }); + } catch (err) { + console.error("Error inserting log into database:", err); + } +} diff --git a/server/services/logger/logger.ts b/server/services/logger/logger.ts index 5c55c56..d93e2d3 100644 --- a/server/services/logger/logger.ts +++ b/server/services/logger/logger.ts @@ -1,4 +1,4 @@ -import {pino, type Logger} from "pino"; +import {pino, type LogFn, type Logger} from "pino"; export let logLevel = "info"; @@ -8,24 +8,20 @@ const transport = pino.transport({ target: "pino-pretty", options: { colorize: true, + singleLine: true, // customPrettifiers: { - // time: (timestamp) => `🕰 ${timestamp}`, + // time: (time) => `🕰 ${time}`, // }, destination: process.stdout.fd, }, }, { - target: "pino-pretty", - options: { - colorize: false, - destination: "./logs/logs.log", - mkdir: true, - }, + target: "./dbTransport.js", }, ], }); -export const log = pino( +const log: Logger = pino( { level: process.env.LOG_LEVEL || logLevel, // formatters: { @@ -33,20 +29,22 @@ export const log = pino( // return {level: label.toUpperCase()}; // }, // }, - customLevels: {death: 70}, + //customLevels: {death: 70}, // removes data from the logs that we dont want to be shown :D redact: {paths: ["email", "password"], remove: true}, }, transport ); -// setTimeout(() => { -// const fun = () => { -// throw Error("Just an error"); -// }; -// try { -// fun(); -// } catch (error) { -// log.error(error, "Somethingbad"); -// } -// }); +export const createLog = ( + level: "info" | "fatal" | "error" | "warn" | "debug" | "trace", + username: string, + service: string, + message: string +) => { + if (level in log) { + log[level]({username, service}, message); + } else { + log.warn({username, service}, `Invalid log level '${level}', falling back to warn: ${message}`); + } +};