cost-claude
Version:
Claude Code cost monitoring, analytics, and optimization toolkit
45 lines • 1.52 kB
JavaScript
import winston from 'winston';
import { join } from 'path';
import { homedir } from 'os';
import { existsSync, mkdirSync } from 'fs';
const logDir = join(homedir(), '.cost-claude', 'logs');
if (!existsSync(logDir)) {
mkdirSync(logDir, { recursive: true });
}
const logFormat = winston.format.combine(winston.format.timestamp({
format: 'YYYY-MM-DD HH:mm:ss',
}), winston.format.errors({ stack: true }), winston.format.splat(), winston.format.json());
const consoleFormat = winston.format.combine(winston.format.colorize(), winston.format.timestamp({
format: 'HH:mm:ss',
}), winston.format.printf(({ timestamp, level, message, ...meta }) => {
let msg = `${timestamp} ${level}: ${message}`;
if (Object.keys(meta).length > 0) {
msg += ` ${JSON.stringify(meta)}`;
}
return msg;
}));
export const logger = winston.createLogger({
level: process.env.LOG_LEVEL || 'info',
format: logFormat,
transports: [
new winston.transports.Console({
format: consoleFormat,
}),
new winston.transports.File({
filename: join(logDir, 'error.log'),
level: 'error',
}),
new winston.transports.File({
filename: join(logDir, 'combined.log'),
}),
],
});
if (process.env.NODE_ENV === 'production') {
logger.add(new winston.transports.File({
filename: join(logDir, 'app.log'),
maxsize: 5242880,
maxFiles: 5,
}));
}
export default logger;
//# sourceMappingURL=logger.js.map