Logging with Winston
Implement proper logging with Winston. Learn log levels and rotation.
Logging with Winston
Why Logging?
- Debug production issues - Track errors - Monitor performance - Audit user actions
Setup
```bash npm install winston ```
Basic Logger
```javascript const winston = require('winston');
const logger = winston.createLogger({ level: 'info', format: winston.format.combine( winston.format.timestamp(), winston.format.json() ), transports: [ new winston.transports.File({ filename: 'error.log', level: 'error' }), new winston.transports.File({ filename: 'combined.log' }) ] });
if (process.env.NODE_ENV !== 'production') { logger.add(new winston.transports.Console({ format: winston.format.simple() })); }
logger.info('User logged in', { userId: 123 }); logger.error('Payment failed', { error: err.message }); ```
Log Levels
```javascript logger.error('Critical error'); logger.warn('Warning message'); logger.info('Info message'); logger.http('HTTP request'); logger.debug('Debug info'); ```
Request Logging
```javascript const morgan = require('morgan');
app.use(morgan('combined', { stream: { write: (message) => logger.http(message.trim()) } })); ```
Error Logging
```javascript process.on('uncaughtException', (error) => { logger.error('Uncaught Exception', { error: error.stack }); process.exit(1); });
app.use((err, req, res, next) => { logger.error('Express error', { error: err.message, stack: err.stack, url: req.url }); res.status(500).json({ error: 'Internal server error' }); }); ```
Key Takeaway
Use Winston for structured logging. Log to files in production. Include context in logs. Monitor error logs. Never log sensitive data.