import { auth } from '@/auth'; import { Session } from 'next-auth'; import { pino, Logger as LokiLogger } from 'pino'; import pinoLoki from 'pino-loki'; let loggerInstance: Logger; class Logger { private lokiLogger!: LokiLogger; constructor() { if (loggerInstance) { return loggerInstance; } this.lokiLogger = pino( { level: 'info' }, pinoLoki({ batching: false, // These labels will be added to every log labels: { app: 'grafanacloud-landingai-logs', namespace: 'vision-agent', }, // Credentials for our Loki instance host: 'https://logs-prod3.grafana.net', basicAuth: { username: process.env.LOKI_AUTH_USER_ID!, password: process.env.LOKI_AUTH_USER_PASSWORD!, }, }), ); this.lokiLogger.debug('test'); loggerInstance = this; return loggerInstance; } private createLogMessage( request: Request, message: Object | string, session: Session | null, logDescription?: string, ) { const body = { type: logDescription || '__DEFAULT', context: { method: request.method, url: request.url, sessionUserId: session?.user.id, sessionUserName: session?.user.name, sessionUserEmail: session?.user.email, }, message: message, }; return body; } info( request: Request, session: Session | null, message: string | Object, logDescription?: string, ) { this.lokiLogger.info( this.createLogMessage(request, message, session, logDescription), ); } warn( request: Request, session: Session | null, message: string | Object, logDescription?: string, ) { this.lokiLogger.warn( this.createLogMessage(request, message, session, logDescription), ); } debug( request: Request, session: Session | null, message: string | Object, logDescription?: string, ) { this.lokiLogger.debug( this.createLogMessage(request, message, session, logDescription), ); } error( request: Request, session: Session | null, message: string | Object, logDescription?: string, ) { this.lokiLogger.error( this.createLogMessage(request, message, session, logDescription), ); } } export const withLogging = ( handler: (session: Session | null, json: any) => Promise, ) => { return async (req: Request) => { const session = await auth(); const json = await req.json(); logger.info( req, session, { params: json, }, '_API_REQUEST', ); return handler(session, json); }; }; export const logger = new Logger();