@nlabs/arkhamjs-middleware-logger
Version:
Add console logging for ArkhamJS
466 lines (373 loc) ⢠13.4 kB
Markdown
# @nlabs/arkhamjs-middleware-logger
> **Powerful Logging Middleware for ArkhamJS** - Comprehensive action and state logging with customizable output formats, filtering, and performance insights.
[](https://www.npmjs.com/package/@nlabs/arkhamjs-middleware-logger)
[](https://www.npmjs.com/package/@nlabs/arkhamjs-middleware-logger)
[](https://travis-ci.org/nitrogenlabs/arkhamjs)
[](https://github.com/nitrogenlabs/arkhamjs/issues)
[](https://github.com/ellerbrock/typescript-badges/)
[](http://opensource.org/licenses/MIT)
[](https://discord.gg/Ttgev58)
## š Features
- **š Comprehensive Logging** - Log actions, state changes, and performance metrics
- **šØ Customizable Output** - Beautiful console formatting with colors and grouping
- **š Action Filtering** - Filter specific actions or action types
- **ā” Performance Tracking** - Measure action execution time and state update performance
- **š² Tree-shakable** - Only include what you need in production
- **š§ Configurable** - Extensive options for customization
- **š± Browser Support** - Works in Chrome, Firefox, Safari, and Edge
## š¦ Installation
```bash
npm install @nlabs/arkhamjs-middleware-logger
```
## šÆ Quick Start
### **Basic Setup**
```typescript
import { Flux } from '@nlabs/arkhamjs';
import { Logger } from '@nlabs/arkhamjs-middleware-logger';
// Initialize Flux with logger middleware
Flux.init({
name: 'my-app',
stores: [UserStore, CartStore],
middleware: [
Logger() // Enable basic logging
]
});
// Dispatch actions and see beautiful logs
Flux.dispatch({ type: 'ADD_USER', user: { name: 'John' } });
```
### **Console Output**
```
š ArkhamJS Logger - Action Dispatched
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
ā Action: ADD_USER ā
ā Timestamp: 2024-01-15T10:30:45.123Z ā
ā Duration: 2.5ms ā
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā¤
ā Payload: ā
ā { ā
ā "user": { ā
ā "name": "John" ā
ā } ā
ā } ā
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā¤
ā State Changes: ā
ā ⢠user.list: [] ā [{"name":"John"}] ā
ā ⢠user.count: 0 ā 1 ā
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
```
## š§ Configuration Options
### **Basic Configuration**
```typescript
import { Logger } from '@nlabs/arkhamjs-middleware-logger';
Flux.init({
name: 'my-app',
stores: [UserStore],
middleware: [
Logger({
// Enable/disable features
logActions: true, // Log dispatched actions
logState: true, // Log state changes
logPerformance: true, // Log performance metrics
// Filtering options
filterActions: ['ADD_USER', 'UPDATE_USER'], // Only log specific actions
excludeActions: ['TICK', 'MOUSE_MOVE'], // Exclude specific actions
// Output options
groupActions: true, // Group related logs
showTimestamp: true, // Show timestamps
showDuration: true, // Show action duration
// Styling
colors: true, // Enable colored output
compact: false, // Compact mode for less verbose output
// Performance thresholds
slowActionThreshold: 100, // Warn for actions taking >100ms
// Custom formatting
formatAction: (action) => `šÆ ${action.type}`,
formatState: (path, oldValue, newValue) =>
`${path}: ${JSON.stringify(oldValue)} ā ${JSON.stringify(newValue)}`
})
]
});
```
### **Production Configuration**
```typescript
import { Logger } from '@nlabs/arkhamjs-middleware-logger';
const isDevelopment = process.env.NODE_ENV === 'development';
Flux.init({
name: 'my-app',
stores: [UserStore],
middleware: [
// Only enable logging in development
...(isDevelopment ? [Logger()] : [])
]
});
```
### **Advanced Filtering**
```typescript
import { Logger } from '@nlabs/arkhamjs-middleware-logger';
interface UserAction {
type: string;
user?: { premium?: boolean };
}
Flux.init({
name: 'my-app',
stores: [UserStore],
middleware: [
Logger({
// Filter by action type pattern
filterActions: (action: UserAction) => action.type.startsWith('USER_'),
// Filter by action payload
filterActions: (action: UserAction) => action.user && action.user.premium,
// Filter state changes
filterState: (path: string, oldValue: any, newValue: any): boolean => {
// Only log significant changes
return JSON.stringify(oldValue) !== JSON.stringify(newValue);
},
// Custom action grouping
groupBy: (action: UserAction): string => {
if (action.type.startsWith('USER_')) return 'User Actions';
if (action.type.startsWith('CART_')) return 'Cart Actions';
return 'Other Actions';
}
})
]
});
```
## šØ Custom Logging Formats
### **Custom Action Formatter**
```typescript
import { Logger } from '@nlabs/arkhamjs-middleware-logger';
interface Action {
type: string;
}
Flux.init({
name: 'my-app',
stores: [UserStore],
middleware: [
Logger({
formatAction: (action: Action): string => {
const icons: Record<string, string> = {
'ADD_USER': 'š¤',
'UPDATE_USER': 'āļø',
'DELETE_USER': 'šļø',
'CART_ADD': 'š',
'CART_REMOVE': 'ā'
};
const icon = icons[action.type] || 'š';
return `${icon} ${action.type}`;
}
})
]
});
```
### **Custom State Formatter**
```typescript
import { Logger } from '@nlabs/arkhamjs-middleware-logger';
Flux.init({
name: 'my-app',
stores: [UserStore],
middleware: [
Logger({
formatState: (path: string, oldValue: any, newValue: any): string => {
const formatValue = (value: any): string => {
if (Array.isArray(value)) return `[${value.length} items]`;
if (typeof value === 'object' && value !== null) return '{...}';
return String(value);
};
return `${path}: ${formatValue(oldValue)} ā ${formatValue(newValue)}`;
}
})
]
});
```
## šÆ Advanced Usage
### **Performance Monitoring**
```typescript
import { Logger } from '@nlabs/arkhamjs-middleware-logger';
Flux.init({
name: 'my-app',
stores: [UserStore],
middleware: [
Logger({
logPerformance: true,
slowActionThreshold: 50, // Warn for actions >50ms
// Custom performance formatter
formatPerformance: (duration: number, action: any): string => {
if (duration > 100) return `š Slow action: ${action.type} (${duration}ms)`;
if (duration > 50) return `ā ļø Medium action: ${action.type} (${duration}ms)`;
return `ā” Fast action: ${action.type} (${duration}ms)`;
}
})
]
});
```
### **Conditional Logging**
```typescript
import { Logger } from '@nlabs/arkhamjs-middleware-logger';
const createLogger = (options: any) => {
const isDevelopment = process.env.NODE_ENV === 'development';
const isTest = process.env.NODE_ENV === 'test';
if (isTest) {
return Logger({
logActions: false,
logState: false,
logPerformance: false
});
}
if (isDevelopment) {
return Logger({
...options,
colors: true,
groupActions: true
});
}
return Logger({
...options,
colors: false,
groupActions: false,
compact: true
});
};
Flux.init({
name: 'my-app',
stores: [UserStore],
middleware: [createLogger()]
});
```
### **Custom Log Handlers**
```typescript
import { Logger } from '@nlabs/arkhamjs-middleware-logger';
Flux.init({
name: 'my-app',
stores: [UserStore],
middleware: [
Logger({
// Custom log handler for external logging services
onActionLogged: (action: any, duration: number) => {
// Send to external logging service
analytics.track('action_dispatched', {
action: action.type,
duration,
timestamp: Date.now()
});
},
onStateChanged: (path: string, oldValue: any, newValue: any) => {
// Track state changes
analytics.track('state_changed', {
path,
oldValue,
newValue
});
}
})
]
});
```
## š§ API Reference
### **Logger Options**
```typescript
interface LoggerOptions {
// Basic settings
logActions?: boolean;
logState?: boolean;
logPerformance?: boolean;
// Filtering
filterActions?: string[] | ((action: any) => boolean);
excludeActions?: string[] | ((action: any) => boolean);
filterState?: (path: string, oldValue: any, newValue: any) => boolean;
// Output formatting
groupActions?: boolean;
showTimestamp?: boolean;
showDuration?: boolean;
colors?: boolean;
compact?: boolean;
// Performance
slowActionThreshold?: number;
// Custom formatters
formatAction?: (action: any) => string;
formatState?: (path: string, oldValue: any, newValue: any) => string;
formatPerformance?: (duration: number, action: any) => string;
// Custom handlers
onActionLogged?: (action: any, duration: number) => void;
onStateChanged?: (path: string, oldValue: any, newValue: any) => void;
// Grouping
groupBy?: (action: any) => string;
}
```
## šÆ Use Cases
### **Development Debugging**
```typescript
import { Logger } from '@nlabs/arkhamjs-middleware-logger';
// Development setup with full logging
const devLogger = Logger({
logActions: true,
logState: true,
logPerformance: true,
colors: true,
groupActions: true,
showTimestamp: true,
showDuration: true
});
Flux.init({
name: 'my-app',
stores: [UserStore],
middleware: [devLogger]
});
```
### **Production Monitoring**
```typescript
import { Logger } from '@nlabs/arkhamjs-middleware-logger';
// Production setup with minimal logging
const prodLogger = Logger({
logActions: false,
logState: false,
logPerformance: true,
colors: false,
compact: true,
slowActionThreshold: 100,
onActionLogged: (action, duration) => {
if (duration > 100) {
// Send slow action alerts
errorReporting.captureMessage(`Slow action: ${action.type}`, {
level: 'warning',
extra: { action, duration }
});
}
}
});
Flux.init({
name: 'my-app',
stores: [UserStore],
middleware: [prodLogger]
});
```
### **Testing Setup**
```typescript
import { Logger } from '@nlabs/arkhamjs-middleware-logger';
// Testing setup with no logging
const testLogger = Logger({
logActions: false,
logState: false,
logPerformance: false
});
Flux.init({
name: 'test-app',
stores: [UserStore],
middleware: [testLogger]
});
```
## š Related Packages
- **[@nlabs/arkhamjs](./packages/arkhamjs/README.md)** - Core Flux framework
- **[@nlabs/arkhamjs-middleware-devtools](./packages/arkhamjs-middleware-devtools/README.md)** - Chrome DevTools integration
- **[@nlabs/arkhamjs-utils-react](./packages/arkhamjs-utils-react/README.md)** - React hooks and utilities
## š Documentation
- **[ArkhamJS Documentation](https://arkhamjs.io)** - Complete API reference
- **[Middleware Guide](https://arkhamjs.io/docs/middleware)** - Middleware development guide
- **[Debugging Guide](https://arkhamjs.io/docs/debugging)** - Debugging best practices
## š¤ Community & Support
- **š¬ [Discord Community](https://discord.gg/Ttgev58)** - Chat with other developers
- **š [GitHub Issues](https://github.com/nitrogenlabs/arkhamjs/issues)** - Report bugs and request features
- **š [Examples](./packages/arkhamjs-example-ts-react/README.md)** - Complete working examples
## š License
MIT License - see [LICENSE](LICENSE) file for details.
---
**Start debugging your ArkhamJS applications with powerful logging today!** š