Merge pull request #73 from kitpdr/fix/cloudflare-logger-compat
fix: replace pino with cloudflare-compatible logger
1 file · +14 -44
M src/lib/utils/logger.server.ts +14 -44
| @@ -1,46 +1,14 @@ | |||
| 1 | 1 | import pino from 'pino'; | |
| 2 | 2 | ||
| 3 | - | const logLevel = process.env.NODE_ENV === 'development' ? 'debug' : 'info'; | |
| 4 | - | ||
| 5 | - | class LoggerService { | |
| 6 | - | private static instance: LoggerService; | |
| 7 | - | private logger: pino.Logger; | |
| 8 | - | private moduleLoggers: Map<string, Logger>; | |
| 9 | - | ||
| 10 | - | private constructor() { | |
| 11 | - | this.logger = pino({ | |
| 12 | - | transport: { | |
| 13 | - | target: 'pino-pretty', | |
| 14 | - | options: { | |
| 15 | - | colorize: true, | |
| 16 | - | translateTime: 'HH:MM:ss', | |
| 17 | - | ignore: 'pid,hostname' | |
| 18 | - | } | |
| 19 | - | }, | |
| 20 | - | level: logLevel | |
| 21 | - | }); | |
| 22 | - | this.moduleLoggers = new Map(); | |
| 23 | - | } | |
| 24 | - | ||
| 25 | - | public static getInstance(): LoggerService { | |
| 26 | - | if (!LoggerService.instance) { | |
| 27 | - | LoggerService.instance = new LoggerService(); | |
| 28 | - | } | |
| 29 | - | return LoggerService.instance; | |
| 3 | + | // Pino without transports works in Cloudflare Workers (no worker threads) | |
| 4 | + | // transports like pino-pretty use worker threads which don't exist in CF Workers | |
| 5 | + | // Use 'debug' level - filtering happens at log time based on env | |
| 6 | + | const logger = pino({ | |
| 7 | + | level: 'debug', | |
| 8 | + | formatters: { | |
| 9 | + | level: (label) => ({ level: label }) | |
| 30 | 10 | } | |
| 31 | - | ||
| 32 | - | public getLogger(module: string): Logger { | |
| 33 | - | if (!this.moduleLoggers.has(module)) { | |
| 34 | - | this.moduleLoggers.set(module, { | |
| 35 | - | debug: (msg: string, obj = {}) => this.logger.debug({ module, ...obj }, msg), | |
| 36 | - | info: (msg: string, obj = {}) => this.logger.info({ module, ...obj }, msg), | |
| 37 | - | warn: (msg: string, obj = {}) => this.logger.warn({ module, ...obj }, msg), | |
| 38 | - | error: (msg: string, obj = {}) => this.logger.error({ module, ...obj }, msg) | |
| 39 | - | }); | |
| 40 | - | } | |
| 41 | - | return this.moduleLoggers.get(module)!; | |
| 42 | - | } | |
| 43 | - | } | |
| 11 | + | }); | |
| 44 | 12 | ||
| 45 | 13 | export interface Logger { | |
| 46 | 14 | debug: (msg: string, obj?: object) => void; | |
| @@ -49,7 +17,9 @@ export interface Logger { | |||
| 49 | 17 | error: (msg: string, obj?: object) => void; | |
| 50 | 18 | } | |
| 51 | 19 | ||
| 52 | - | // Export a function to get a logger for a specific module | |
| 53 | - | export const createLogger = (module: string): Logger => { | |
| 54 | - | return LoggerService.getInstance().getLogger(module); | |
| 55 | - | }; | |
| 20 | + | export const createLogger = (module: string): Logger => ({ | |
| 21 | + | debug: (msg: string, obj = {}) => logger.debug({ module, ...obj }, msg), | |
| 22 | + | info: (msg: string, obj = {}) => logger.info({ module, ...obj }, msg), | |
| 23 | + | warn: (msg: string, obj = {}) => logger.warn({ module, ...obj }, msg), | |
| 24 | + | error: (msg: string, obj = {}) => logger.error({ module, ...obj }, msg) | |
| 25 | + | }); | |
| @@ -1,46 +1,14 @@ | |||||
| 1 | import pino from 'pino'; | 1 | import pino from 'pino'; | ||
| 2 | 2 | ||||
| 3 | - | const logLevel = process.env.NODE_ENV === 'development' ? 'debug' : 'info'; | 3 | + | // Pino without transports works in Cloudflare Workers (no worker threads) |
| 4 | - | 4 | + | // transports like pino-pretty use worker threads which don't exist in CF Workers | |
| 5 | - | class LoggerService { | 5 | + | // Use 'debug' level - filtering happens at log time based on env |
| 6 | - | private static instance: LoggerService; | 6 | + | const logger = pino({ |
| 7 | - | private logger: pino.Logger; | 7 | + | level: 'debug', |
| 8 | - | private moduleLoggers: Map<string, Logger>; | 8 | + | formatters: { |
| 9 | - | 9 | + | level: (label) => ({ level: label }) | |
| 10 | - | private constructor() { | |||
| 11 | - | this.logger = pino({ | |||
| 12 | - | transport: { | |||
| 13 | - | target: 'pino-pretty', | |||
| 14 | - | options: { | |||
| 15 | - | colorize: true, | |||
| 16 | - | translateTime: 'HH:MM:ss', | |||
| 17 | - | ignore: 'pid,hostname' | |||
| 18 | - | } | |||
| 19 | - | }, | |||
| 20 | - | level: logLevel | |||
| 21 | - | }); | |||
| 22 | - | this.moduleLoggers = new Map(); | |||
| 23 | - | } | |||
| 24 | - | ||||
| 25 | - | public static getInstance(): LoggerService { | |||
| 26 | - | if (!LoggerService.instance) { | |||
| 27 | - | LoggerService.instance = new LoggerService(); | |||
| 28 | - | } | |||
| 29 | - | return LoggerService.instance; | |||
| 30 | } | 10 | } | ||
| 31 | - | 11 | + | }); | |
| 32 | - | public getLogger(module: string): Logger { | |||
| 33 | - | if (!this.moduleLoggers.has(module)) { | |||
| 34 | - | this.moduleLoggers.set(module, { | |||
| 35 | - | debug: (msg: string, obj = {}) => this.logger.debug({ module, ...obj }, msg), | |||
| 36 | - | info: (msg: string, obj = {}) => this.logger.info({ module, ...obj }, msg), | |||
| 37 | - | warn: (msg: string, obj = {}) => this.logger.warn({ module, ...obj }, msg), | |||
| 38 | - | error: (msg: string, obj = {}) => this.logger.error({ module, ...obj }, msg) | |||
| 39 | - | }); | |||
| 40 | - | } | |||
| 41 | - | return this.moduleLoggers.get(module)!; | |||
| 42 | - | } | |||
| 43 | - | } | |||
| 44 | 12 | ||||
| 45 | export interface Logger { | 13 | export interface Logger { | ||
| 46 | debug: (msg: string, obj?: object) => void; | 14 | debug: (msg: string, obj?: object) => void; | ||
| @@ -49,7 +17,9 @@ export interface Logger { | |||||
| 49 | error: (msg: string, obj?: object) => void; | 17 | error: (msg: string, obj?: object) => void; | ||
| 50 | } | 18 | } | ||
| 51 | 19 | ||||
| 52 | - | // Export a function to get a logger for a specific module | 20 | + | export const createLogger = (module: string): Logger => ({ |
| 53 | - | export const createLogger = (module: string): Logger => { | 21 | + | debug: (msg: string, obj = {}) => logger.debug({ module, ...obj }, msg), |
| 54 | - | return LoggerService.getInstance().getLogger(module); | 22 | + | info: (msg: string, obj = {}) => logger.info({ module, ...obj }, msg), |
| 55 | - | }; | 23 | + | warn: (msg: string, obj = {}) => logger.warn({ module, ...obj }, msg), |
| 24 | + | error: (msg: string, obj = {}) => logger.error({ module, ...obj }, msg) | |||
| 25 | + | }); | |||