simple-logmate
Version:
A flexible and powerful logging utility for Node.js applications.
188 lines (148 loc) • 5.5 kB
Markdown
# Simple Logmate
A flexible and powerful logging utility for Node.js applications with support for multiple transports, log rotation, custom formatting, and HTTP request logging.
## Features
- **Multiple Log Levels**: Supports `debug`, `info`, `warn`, and `error` levels
- **Custom Timestamp Formats**: Include timestamps in each log message with customizable formats
- **Configurable Message Formatting**: Define how log messages should look with template strings
- **File Logging with Rotation**: Automatic log file rotation based on file size
- **Multiple Transport Support**: Log to different destinations (console, file) simultaneously
- **Asynchronous File Writing**: Non-blocking logging operations for better performance
- **HTTP Request Logging**: Built-in support for logging HTTP requests with detailed information
- **Zero Dependencies**: Lightweight and self-contained
## Installation
```bash
npm install simple-logmate
# or using yarn
yarn add simple-logmate
```
## Quick Start
```javascript
const Logger = require('simple-logmate');
// Create a new logger instance with HTTP request logging enabled
const logger = new Logger({
level: 'debug',
format: '[{timestamp}] [{level}] {message}',
filePath: './logs/app.log',
maxFileSize: 1024 * 1024, // 1MB
transports: ['console', 'file'],
httpRequest: true // Enable HTTP request logging
});
// Basic logging
logger.info('Application started');
logger.debug('Debug information');
logger.warn('Warning message');
logger.error('Error occurred', new Error('Something went wrong'));
// HTTP Request logging will be automatic if httpRequest is true
app.use((req, res, next) => next());
```
## Configuration Options
| Option | Type | Default | Description |
|--------|------|---------|-------------|
| `level` | string | `'info'` | Minimum log level (`'debug'`, `'info'`, `'warn'`, `'error'`) |
| `format` | string | `'[{timestamp}] {level}: {message}'` | Message format template |
| `filePath` | string | - | Path to log file (required for file transport) |
| `maxFileSize` | number | `1048576` (1MB) | Maximum size of log file before rotation |
| `transports` | string[] | `['console']` | Array of transport types (`'console'`, `'file'`) |
| `httpRequest` | boolean | `false` | Enable automatic HTTP request logging |
## Advanced Usage
### HTTP Request Logging
The logger includes built-in support for HTTP request logging. There are two ways to use it:
1. **Automatic Mode** (Recommended):
```javascript
const express = require('express');
const Logger = require('simple-logmate');
const app = express();
const logger = new Logger({
level: 'debug',
transports: ['console', 'file'],
filePath: './logs/access.log',
httpRequest: true // Enable automatic HTTP request logging
});
// No additional middleware needed - logging happens automatically
app.use(express.json());
app.get('/api/users', (req, res) => {
res.json({ users: [] });
});
```
2. **Manual Mode**:
```javascript
const logger = new Logger({
level: 'debug',
transports: ['console', 'file'],
filePath: './logs/access.log',
httpRequest: false // Disable automatic logging
});
// Manual middleware for request logging
app.use((req, res, next) => {
const start = Date.now();
res.on('finish', () => {
const responseTime = Date.now() - start;
logger.logRequest(req, res, responseTime);
});
next();
});
```
Example outputs remain the same for both modes:
```
// Info level output:
[2024-03-21 14:30:45.123] info: GET /api/users 200 150ms
// Debug level output:
[2024-03-21 14:30:45.123] debug: Request Details: {
"method": "GET",
"url": "/api/users",
"status": 200,
"responseTime": "150ms",
"userAgent": "Mozilla/5.0...",
"ip": "127.0.0.1"
}
```
### Log Rotation Example
```javascript
const logger = new Logger({
level: 'info',
filePath: './logs/app.log',
maxFileSize: 5 * 1024 * 1024, // 5MB
transports: ['file']
});
async function testLogRotation() {
for (let i = 0; i < 1000; i++) {
logger.info(`Log message ${i}`);
await new Promise(resolve => setTimeout(resolve, 10));
}
}
testLogRotation().catch(console.error);
```
### Custom Format Example
```javascript
const logger = new Logger({
format: '[{timestamp}] [{level}] [{service}] {message}',
level: 'debug',
transports: ['console'],
metadata: {
service: 'user-service'
}
});
logger.info('User logged in', { userId: 123 });
// Output: [2024-03-21T10:30:00Z] [INFO] [user-service] User logged in {"userId":123}
```
## Error Handling
The logger automatically handles errors and stack traces:
```javascript
try {
throw new Error('Database connection failed');
} catch (error) {
logger.error('Failed to connect to database', error);
}
```
## License
This project is licensed under the MIT License.
## Contributing
1. Fork the repository
2. Create your feature branch (`git checkout -b feature/amazing-feature`)
3. Commit your changes (`git commit -m 'Add some amazing feature'`)
4. Push to the branch (`git push origin feature/amazing-feature`)
5. Open a Pull Request
## Support
If you encounter any issues or have questions, please [open an issue](https://github.com/abu-tahir-0/simple-logmate/issues) on GitHub.
## Author
Abu Tahir