import pino from "pino"; import { env } from "@/env"; import { SentryLogger } from "@/server/sentry.server.config"; import { mask } from "./mask"; const serializers: { [key: string]: pino.SerializerFn } = { password: (payload) => { if (payload) { return env.IS_DEV ? mask(payload) : mask(payload, { visibleStart: 0, visibleEnd: 0, }); } return payload; }, email: (payload) => { if (payload) { return env.IS_DEV ? payload : mask(payload); } return payload; }, }; export const baseLogger = pino({ level: process.env.LOG_LEVEL || "info", timestamp: pino.stdTimeFunctions.isoTime, serializers, hooks: { logMethod(args, method, level) { const [msg, ...rest] = args; switch (level) { case pinoLevels.error: SentryLogger.error(msg, rest); break; case pinoLevels.warn: SentryLogger.warn(msg, rest); break; case pinoLevels.info: SentryLogger.info(msg, rest); break; case pinoLevels.debug: SentryLogger.debug(msg, rest); break; } method.apply(this, args); }, }, }); export const loggerModule = (loggerName: string) => { return baseLogger.child({ module: loggerName }); }; const pinoLevels = { trace: 10, debug: 20, info: 30, warn: 40, error: 50, fatal: 60, } as const;