🎁 Get the FREE AI Skills Starter Guide β€” Subscribe β†’
BytesAgainBytesAgain
πŸ¦€ ClawHub

Cuihua Logger

by @supermario11

πŸ“ AI-powered logging assistant that generates production-ready structured logs. Automatically add intelligent logging to your code with proper levels, conte...

Versionv1.0.0
Downloads470
TERMINAL
clawhub install cuihua-logger

πŸ“– About This Skill


name: cuihua-logger description: | πŸ“ 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.

metadata: openclaw: requires: bins: - node env: [] primaryEnv: null version: "1.0.0" author: "翠花 (Cuihua) - ClawHub Pioneer" license: "MIT" tags: - logging - debugging - monitoring - observability - structured-logging - winston - pino - production-ready capabilities: - Auto-generate structured logs - Smart log level selection - Context-aware logging - Performance logging - Error tracking - Log coverage analysis - Multiple logger support (Winston, Pino, Bunyan)


cuihua-logger - Production-Ready Logging πŸ“

> Debug faster with intelligent, structured logging.

An AI-powered logging assistant that automatically:

  • πŸ“ Generates structured logs with proper context
  • 🎯 Selects appropriate log levels (debug, info, warn, error)
  • πŸ“Š Adds performance metrics and timing
  • πŸ” Detects missing logs in critical paths
  • ⚑ Optimizes log output for production
  • 🎯 Why cuihua-logger?

    The problem:

  • ❌ Too many console.log() everywhere
  • ❌ No structure, hard to search
  • ❌ Wrong log levels (everything is "info")
  • ❌ Missing context (what user? what request?)
  • ❌ Performance overhead in production
  • cuihua-logger solves all of this.


    πŸš€ Quick Start

    Analyze logging coverage

    > "Check logging coverage in src/"

    Add structured logging

    > "Add logging to getUserById function"

    Generate performance logs

    > "Add performance logging to API endpoints"


    🎨 Features

    1. Structured Logging ✨

    // ❌ 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; }

    2. Smart Log Levels 🎯

    // 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

    3. Performance Logging ⚑

    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

    4. Request Tracking πŸ”

    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();
    });
    


    πŸ“‹ Usage Examples

    Example 1: Add Logging to Function

    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;
      }
    }
    

    Example 2: API Endpoint Logging

    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' });
      }
    });
    


    βš™οΈ Logger Configuration

    Winston

    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' }) ] });

    Pino (fastest)

    import pino from 'pino';

    const logger = pino({ level: process.env.LOG_LEVEL || 'info', timestamp: pino.stdTimeFunctions.isoTime, formatters: { level: (label) => ({ level: label }) } });


    πŸ“Š Log Levels

    | 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 }) |


    πŸ’° Pricing

    Free

  • βœ… Basic log generation
  • βœ… Up to 10 files
  • Pro ($8/month)

  • βœ… Unlimited files
  • βœ… Performance logging
  • βœ… Request tracking
  • βœ… CI/CD integration
  • Enterprise ($59/month)

  • βœ… Team policies
  • βœ… Log aggregation setup
  • βœ… Custom formatters

  • πŸ“š Best Practices

    1. Always log errors with context 2. Use structured logging (objects, not strings) 3. Include request IDs for tracing 4. Don't log sensitive data (passwords, tokens) 5. Use appropriate log levels


    πŸ“œ License

    MIT


    πŸ™ Acknowledgments

    Built with 🌸 by 翠花 (Cuihua)


    Made with 🌸 | Cuihua Series | ClawHub Pioneer