Install
openclaw skills install cuihua-logger📝 AI-powered logging assistant that generates production-ready structured logs. Automatically add intelligent logging to your code with proper levels, context, and formatting. Because good logging saves hours of debugging.
openclaw skills install cuihua-loggerDebug faster with intelligent, structured logging.
An AI-powered logging assistant that automatically:
The problem:
console.log() everywherecuihua-logger solves all of this.
"Check logging coverage in src/"
"Add logging to getUserById function"
"Add performance logging to API endpoints"
// ❌ BEFORE - Unstructured
async function getUserById(id) {
console.log('Getting user:', id);
const user = await db.query('SELECT * FROM users WHERE id = $1', [id]);
console.log('User found:', user);
return user;
}
// ✅ AFTER - Structured
async function getUserById(id) {
logger.info('Fetching user', {
userId: id,
operation: 'getUserById'
});
const startTime = Date.now();
const user = await db.query('SELECT * FROM users WHERE id = $1', [id]);
const duration = Date.now() - startTime;
logger.info('User fetched successfully', {
userId: id,
operation: 'getUserById',
duration,
found: !!user
});
return user;
}
// Automatic level selection based on context
logger.debug('Cache hit', { key, ttl }); // Development only
logger.info('User logged in', { userId, ip }); // Important events
logger.warn('Rate limit approaching', {
userId,
current: 95,
limit: 100
}); // Potential issues
logger.error('Payment failed', {
orderId,
error: error.message,
stack: error.stack
}); // Critical errors
async function fetchData() {
const timer = logger.startTimer();
const data = await expensiveOperation();
timer.done({ level: 'info', message: 'Operation complete' });
return data;
}
// Output: "Operation complete" duration=1234ms
app.use((req, res, next) => {
req.requestId = generateId();
req.logger = logger.child({
requestId: req.requestId,
method: req.method,
path: req.path
});
req.logger.info('Request started');
res.on('finish', () => {
req.logger.info('Request completed', {
statusCode: res.statusCode,
duration: Date.now() - req.startTime
});
});
next();
});
User: "Add logging to processOrder function"
Generated:
async function processOrder(orderId, items) {
logger.info('Processing order', { orderId, itemCount: items.length });
try {
// Validate
if (!orderId || !items.length) {
logger.warn('Invalid order data', { orderId, items });
throw new ValidationError('Invalid order');
}
// Create order
const order = await createOrder(orderId, items);
logger.info('Order created', { orderId, orderNumber: order.number });
// Process payment
const payment = await processPayment(order);
logger.info('Payment processed', {
orderId,
paymentId: payment.id,
amount: payment.amount
});
return order;
} catch (error) {
logger.error('Order processing failed', {
orderId,
error: error.message,
stack: error.stack
});
throw error;
}
}
app.post('/api/users', async (req, res) => {
const { logger } = req;
logger.info('Creating user', { email: req.body.email });
try {
const user = await userService.create(req.body);
logger.info('User created successfully', {
userId: user.id,
email: user.email
});
res.status(201).json(user);
} catch (error) {
logger.error('User creation failed', {
email: req.body.email,
error: error.message
});
res.status(500).json({ error: 'Failed to create user' });
}
});
import winston from 'winston';
const logger = winston.createLogger({
level: process.env.LOG_LEVEL || 'info',
format: winston.format.combine(
winston.format.timestamp(),
winston.format.errors({ stack: true }),
winston.format.json()
),
transports: [
new winston.transports.File({ filename: 'error.log', level: 'error' }),
new winston.transports.File({ filename: 'combined.log' })
]
});
import pino from 'pino';
const logger = pino({
level: process.env.LOG_LEVEL || 'info',
timestamp: pino.stdTimeFunctions.isoTime,
formatters: {
level: (label) => ({ level: label })
}
});
| Level | When to Use | Example |
|---|---|---|
| debug | Development debugging | logger.debug('Cache miss', { key }) |
| info | Important events | logger.info('User logged in', { userId }) |
| warn | Potential issues | logger.warn('Rate limit approaching', { userId }) |
| error | Errors that need attention | logger.error('Payment failed', { orderId }) |
MIT
Built with 🌸 by 翠花 (Cuihua)
Made with 🌸 | Cuihua Series | ClawHub Pioneer