From ed68978aa73aabe6fb36146db1afa1e472cc277e Mon Sep 17 00:00:00 2001 From: "Anthony D. Mays" Date: Wed, 15 Jan 2025 18:22:01 -0800 Subject: [PATCH] chore: adds redis transport --- .../src/util/redis-transport.ts | 30 +++++++++++++++++++ .../fullstack_demo/src/util/server-logger.ts | 17 ++++++++--- 2 files changed, 43 insertions(+), 4 deletions(-) create mode 100644 lib/javascript/fullstack_demo/src/util/redis-transport.ts diff --git a/lib/javascript/fullstack_demo/src/util/redis-transport.ts b/lib/javascript/fullstack_demo/src/util/redis-transport.ts new file mode 100644 index 000000000..76dd567a6 --- /dev/null +++ b/lib/javascript/fullstack_demo/src/util/redis-transport.ts @@ -0,0 +1,30 @@ +import { Redis } from '@upstash/redis'; +import { v4 as uuidv4 } from 'uuid'; +import Transport from 'winston-transport'; + +export class RedisTransport extends Transport { + private readonly redis: Redis; + + constructor(opts: any) { + super(opts); + this.redis = new Redis({ + url: process.env.KV_REST_API_URL, + token: process.env.KV_REST_API_TOKEN, + }); + } + + async log(info: any, callback: () => void): Promise { + setImmediate(() => { + this.emit('logged', info); + }); + + try { + const uuid = uuidv4(); + await this.redis.append(`logs:${uuid}`, JSON.stringify(info)); + } catch (ex) { + console.error('Failed to log to Redis', ex); + } + + callback(); + } +} diff --git a/lib/javascript/fullstack_demo/src/util/server-logger.ts b/lib/javascript/fullstack_demo/src/util/server-logger.ts index c088d6975..023407f44 100644 --- a/lib/javascript/fullstack_demo/src/util/server-logger.ts +++ b/lib/javascript/fullstack_demo/src/util/server-logger.ts @@ -2,14 +2,26 @@ import { LogEvent } from '@/models'; import { auth } from '@clerk/nextjs/server'; import { headers } from 'next/headers'; import winston, { format } from 'winston'; +import Transport from 'winston-transport'; import { Logger, LogLevel } from './logger'; import { PrismaTransport } from './prisma-transport'; +import { RedisTransport } from './redis-transport'; const { combine, timestamp, json } = format; export class WinstonLogger implements Logger { private readonly winstonLogger: winston.Logger; constructor() { + const transports: Transport[] = [ + new winston.transports.Console({ level: 'info' }), + ]; + + if (process.env.LOGGING_DB_TYPE?.toUpperCase() === 'POSTGRES') { + transports.push(new PrismaTransport({ level: 'debug' })); + } else if (process.env.LOGGING_DB_TYPE?.toUpperCase() === 'REDIS') { + transports.push(new RedisTransport({ level: 'debug' })); + } + this.winstonLogger = winston.createLogger({ level: 'debug', format: combine( @@ -22,10 +34,7 @@ export class WinstonLogger implements Logger { timestamp(), json(), ), - transports: [ - new winston.transports.Console({ level: 'info' }), - new PrismaTransport({ level: 'debug' }), - ], + transports, }); }