import pino from 'pino'; import fs from 'fs'; import path from 'path'; import dotenv from 'dotenv'; dotenv.config(); const logDir = path.dirname(process.env.LOG_FILE || 'logs/simulator.log'); const logFile = process.env.LOG_FILE || 'logs/simulator.log'; if (!fs.existsSync(logDir)) { fs.mkdirSync(logDir, { recursive: true }); } const targets = [ { level: process.env.LOG_LEVEL || 'info', target: 'pino-pretty', options: { colorize: true, translateTime: 'SYS:standard', ignore: 'pid,hostname', }, }, { level: process.env.LOG_LEVEL || 'info', target: 'pino/file', options: { destination: logFile, mkdir: true, append: true, }, }, ]; const logger = pino( { level: process.env.LOG_LEVEL || 'info', base: { pid: false }, timestamp: () => `,"time":"${new Date().toISOString()}"`, redact: { paths: ['github.token', 'ai.huggingface.apiKey'], censor: '[REDACTED]', }, }, pino.transport({ targets }) ); const originalError = logger.error.bind(logger); logger.error = (obj, msg, ...args) => { if (obj instanceof Error) { originalError( { err: { message: obj.message, stack: obj.stack, name: obj.name, }, }, msg || obj.message, ...args ); } else { originalError(obj, msg, ...args); } }; export default logger;