perchance-ai-prompt-library
Version:
🎨 Complete AI prompt library and generator with advanced CLI, batch processing, analytics, and multi-format export capabilities
85 lines (75 loc) • 2.21 kB
JavaScript
const winston = require('winston');
const path = require('path');
const { createLogger, format, transports } = winston;
const { combine, timestamp, printf, colorize, errors } = format;
// Define log format
const logFormat = printf(({ level, message, timestamp, stack }) => {
return `${timestamp} [${level.toUpperCase()}]: ${stack || message}`;
});
// Create logger instance
const logger = createLogger({
level: process.env.LOG_LEVEL || 'info',
format: combine(
timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
errors({ stack: true }),
logFormat
),
defaultMeta: { service: 'perchance-ai-prompt-library' },
transports: [
// Console transport
new transports.Console({
format: combine(
colorize(),
timestamp({ format: 'HH:mm:ss' }),
printf(({ level, message, timestamp, stack }) => {
return `${timestamp} [${level}]: ${stack || message}`;
})
)
}),
// File transport for errors
new transports.File({
filename: path.join('logs', 'error.log'),
level: 'error',
maxsize: 5242880, // 5MB
maxFiles: 5
}),
// File transport for all logs
new transports.File({
filename: path.join('logs', 'combined.log'),
maxsize: 10485760, // 10MB
maxFiles: 5
})
],
exceptionHandlers: [
new transports.File({ filename: path.join('logs', 'exceptions.log') })
],
exitOnError: false
});
// Create logs directory if it doesn't exist
const fs = require('fs');
const logDir = 'logs';
if (!fs.existsSync(logDir)) {
fs.mkdirSync(logDir);
}
// Add a stream for Morgan HTTP logging
logger.stream = {
write: (message) => {
logger.info(message.trim());
}
};
// Add a method for API request logging
logger.api = (req, res, next) => {
const start = Date.now();
res.on('finish', () => {
const duration = Date.now() - start;
logger.info(`${req.method} ${req.originalUrl} ${res.statusCode} - ${duration}ms`);
});
next();
};
// Add a method for debug logging that respects log level
logger.debug = (message, meta) => {
if (logger.levels[logger.level] >= logger.levels['debug']) {
logger.log('debug', message, meta);
}
};
module.exports = logger;