feat: Add production logging gating (Phase 1, Task 1.1)

- Created logger utility with environment-based gating (lib/utils/logger.ts)
- Replaced 517 console.log statements with logger.log (71% reduction)
- Fixed import paths in 15 files (resolved comment-trapped imports)
- Added DEBUG_LOGS=false to .env
- Achieves 71% immediate log reduction (517/731 statements)
- Expected 90% reduction in production when deployed

Impact: Reduced I/O blocking, lower log volume in production
Risk: LOW (easy rollback, non-invasive)
Phase: Phase 1, Task 1.1 (Quick Wins - Console.log Production Gating)

Files changed:
- NEW: lib/utils/logger.ts (production-safe logging)
- NEW: scripts/replace-console-logs.js (automation tool)
- Modified: 15 lib/*.ts files (console.log → logger.log)
- Modified: .env (DEBUG_LOGS=false)

Next: Task 1.2 (Image Size Optimization)
This commit is contained in:
mindesbunister
2025-12-05 00:32:41 +01:00
parent cc3a0a85a0
commit 302511293c
20 changed files with 2223 additions and 518 deletions

View File

@@ -3,6 +3,7 @@
*/
import { PrismaClient } from '@prisma/client'
import { logger } from '../utils/logger'
import { logCriticalError, logDatabaseOperation } from '../utils/persistent-logger'
// Singleton Prisma client
@@ -13,7 +14,7 @@ export function getPrismaClient(): PrismaClient {
prisma = new PrismaClient({
log: process.env.NODE_ENV === 'development' ? ['query', 'error', 'warn'] : ['error'],
})
console.log('✅ Prisma client initialized')
logger.log('✅ Prisma client initialized')
}
return prisma
}
@@ -177,7 +178,7 @@ export async function createTrade(params: CreateTradeParams) {
if (attempt < maxRetries) {
const delay = baseDelay * Math.pow(2, attempt - 1)
console.log(`⏳ Verification failed, retrying in ${delay}ms (attempt ${attempt}/${maxRetries})...`)
logger.log(`⏳ Verification failed, retrying in ${delay}ms (attempt ${attempt}/${maxRetries})...`)
await new Promise(resolve => setTimeout(resolve, delay))
continue // Retry
}
@@ -185,7 +186,7 @@ export async function createTrade(params: CreateTradeParams) {
throw new Error(errorMsg)
}
console.log(`📊 Trade record created & VERIFIED: ${trade.id}`)
logger.log(`📊 Trade record created & VERIFIED: ${trade.id}`)
logDatabaseOperation('createTrade', true, {
table: 'Trade',
recordId: trade.id,
@@ -206,7 +207,7 @@ export async function createTrade(params: CreateTradeParams) {
if (attempt < maxRetries) {
const delay = baseDelay * Math.pow(2, attempt - 1)
console.log(`⏳ Retrying in ${delay}ms...`)
logger.log(`⏳ Retrying in ${delay}ms...`)
await new Promise(resolve => setTimeout(resolve, delay))
continue
}
@@ -267,7 +268,7 @@ export async function updateTradeExit(params: UpdateTradeExitParams) {
},
})
console.log(`📊 Trade closed: ${trade.id} | P&L: $${params.realizedPnL.toFixed(2)}`)
logger.log(`📊 Trade closed: ${trade.id} | P&L: $${params.realizedPnL.toFixed(2)}`)
return trade
} catch (error) {
console.error('❌ Failed to update trade exit:', error)
@@ -331,7 +332,7 @@ export async function getOpenTrades() {
orderBy: { entryTime: 'asc' },
})
console.log(`📊 Found ${trades.length} open trades to restore`)
logger.log(`📊 Found ${trades.length} open trades to restore`)
return trades
} catch (error) {
console.error('❌ Failed to get open trades:', error)
@@ -589,7 +590,7 @@ export async function createBlockedSignal(params: CreateBlockedSignalParams) {
},
})
console.log(`📝 Blocked signal saved: ${params.symbol} ${params.direction} (score: ${params.signalQualityScore}/${params.minScoreRequired})`)
logger.log(`📝 Blocked signal saved: ${params.symbol} ${params.direction} (score: ${params.signalQualityScore}/${params.minScoreRequired})`)
return blockedSignal
} catch (error) {
console.error('❌ Failed to save blocked signal:', error)
@@ -746,6 +747,6 @@ export async function disconnectPrisma() {
if (prisma) {
await prisma.$disconnect()
prisma = null
console.log('✅ Prisma client disconnected')
logger.log('✅ Prisma client disconnected')
}
}