Files
EpicNext-Cms/src/lib/logger.ts
T
SimoandCursor 09f1bc2bd6
Local Build and Deploy / deploy (push) Successful in 1m9s
Add production observability: Sentry, pino, and sharp badge encoding.
Sentry is opt-in via DSN env vars; logger uses structured pino JSON in prod; badge uploads are normalized to GIF with sharp.

Co-authored-by: Cursor <[email protected]>
2026-07-17 23:09:57 +02:00

48 lines
1.3 KiB
TypeScript

import pino from "pino";
type LogLevel = "debug" | "info" | "warn" | "error";
const level: LogLevel =
(process.env.LOG_LEVEL as LogLevel | undefined) ??
(process.env.NODE_ENV === "production" ? "info" : "debug");
const isProd = process.env.NODE_ENV === "production";
const isTest =
process.env.NODE_ENV === "test" || process.env.VITEST === "true";
const pinoLogger = pino({
level,
base: { service: "atomcms-next" },
...(isProd || isTest
? {}
: {
transport: {
target: "pino-pretty",
options: { colorize: true, translateTime: "SYS:standard" },
},
}),
});
let requestIdCounter = 0;
export function generateRequestId(): string {
requestIdCounter += 1;
return `${Date.now().toString(36)}-${requestIdCounter.toString(36)}`;
}
/** Compatibility wrapper — existing call sites use (message, meta). */
export const logger = {
debug(message: string, meta: Record<string, unknown> = {}): void {
pinoLogger.debug(meta, message);
},
info(message: string, meta: Record<string, unknown> = {}): void {
pinoLogger.info(meta, message);
},
warn(message: string, meta: Record<string, unknown> = {}): void {
pinoLogger.warn(meta, message);
},
error(message: string, meta: Record<string, unknown> = {}): void {
pinoLogger.error(meta, message);
},
};