hazo_logs 1.0.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +380 -0
- package/package.json +2 -2
package/README.md
ADDED
|
@@ -0,0 +1,380 @@
|
|
|
1
|
+
# hazo_logs
|
|
2
|
+
|
|
3
|
+
A Winston-based logging library for Node.js/Next.js applications with a built-in log viewer UI.
|
|
4
|
+
|
|
5
|
+
[](https://www.npmjs.com/package/hazo_logs)
|
|
6
|
+
[](https://opensource.org/licenses/MIT)
|
|
7
|
+
|
|
8
|
+
## Features
|
|
9
|
+
|
|
10
|
+
- **Structured Logging**: Winston wrapper with singleton pattern for consistent logging across your app
|
|
11
|
+
- **Package Tagging**: Automatically tag logs by package/module name
|
|
12
|
+
- **Daily Rotation**: Automatic log file rotation with configurable retention
|
|
13
|
+
- **Session Tracking**: Track logs across async operations with sessionId and reference
|
|
14
|
+
- **Built-in UI**: React-based log viewer with filtering, sorting, and pagination
|
|
15
|
+
- **Zero Config**: Works out of the box with sensible defaults
|
|
16
|
+
- **Minimal Integration**: Add log viewer to your app with just 2 files (~6 lines of code)
|
|
17
|
+
|
|
18
|
+
## Quick Start
|
|
19
|
+
|
|
20
|
+
### Installation
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
npm install hazo_logs
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
For the UI components, also install peer dependencies:
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
npm install hazo_logs next react hazo_ui
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### Basic Usage (Logging Only)
|
|
33
|
+
|
|
34
|
+
**1. Create a logger in your code:**
|
|
35
|
+
|
|
36
|
+
```typescript
|
|
37
|
+
import { createLogger } from 'hazo_logs';
|
|
38
|
+
|
|
39
|
+
const logger = createLogger('my-package');
|
|
40
|
+
|
|
41
|
+
logger.info('Application started');
|
|
42
|
+
logger.warn('This is a warning', { userId: 123 });
|
|
43
|
+
logger.error('Something went wrong', { error: 'details' });
|
|
44
|
+
logger.debug('Debug information');
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
**2. (Optional) Configure logging:**
|
|
48
|
+
|
|
49
|
+
Create `hazo_logs_config.ini` in your project root:
|
|
50
|
+
|
|
51
|
+
```ini
|
|
52
|
+
[hazo_logs]
|
|
53
|
+
log_directory = ./logs
|
|
54
|
+
log_level = info
|
|
55
|
+
enable_console = true
|
|
56
|
+
enable_file = true
|
|
57
|
+
max_file_size = 20m
|
|
58
|
+
max_files = 14d
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
That's it! Logs will be written to `./logs/hazo-YYYY-MM-DD.log` files.
|
|
62
|
+
|
|
63
|
+
### Add Log Viewer UI (Optional)
|
|
64
|
+
|
|
65
|
+
Add a log viewer to your Next.js app with just 2 files:
|
|
66
|
+
|
|
67
|
+
**1. Create API route** (`app/api/logs/route.ts`):
|
|
68
|
+
|
|
69
|
+
```typescript
|
|
70
|
+
import { createLogApiHandler } from 'hazo_logs/ui/server';
|
|
71
|
+
|
|
72
|
+
const handler = createLogApiHandler();
|
|
73
|
+
|
|
74
|
+
export const { GET } = handler;
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
**2. Create UI page** (`app/logs/page.tsx`):
|
|
78
|
+
|
|
79
|
+
```typescript
|
|
80
|
+
'use client';
|
|
81
|
+
|
|
82
|
+
import { LogViewerPage } from 'hazo_logs/ui';
|
|
83
|
+
|
|
84
|
+
export default function LogsPage() {
|
|
85
|
+
return <LogViewerPage apiBasePath="/api/logs" title="System Logs" />;
|
|
86
|
+
}
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
Visit `/logs` in your app to view logs!
|
|
90
|
+
|
|
91
|
+
## Advanced Usage
|
|
92
|
+
|
|
93
|
+
### Session and Reference Tracking
|
|
94
|
+
|
|
95
|
+
Track logs across async operations:
|
|
96
|
+
|
|
97
|
+
```typescript
|
|
98
|
+
import { createLogger } from 'hazo_logs';
|
|
99
|
+
import { runWithLogContext } from 'hazo_logs';
|
|
100
|
+
|
|
101
|
+
const logger = createLogger('auth');
|
|
102
|
+
|
|
103
|
+
async function handleRequest(req) {
|
|
104
|
+
await runWithLogContext(
|
|
105
|
+
{
|
|
106
|
+
sessionId: req.sessionId,
|
|
107
|
+
reference: `user-${req.userId}`,
|
|
108
|
+
depth: 0,
|
|
109
|
+
},
|
|
110
|
+
async () => {
|
|
111
|
+
logger.info('Request started'); // Automatically includes sessionId and reference
|
|
112
|
+
await processRequest(req);
|
|
113
|
+
logger.info('Request completed');
|
|
114
|
+
}
|
|
115
|
+
);
|
|
116
|
+
}
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
### Embedded Log Viewer
|
|
120
|
+
|
|
121
|
+
Use the log viewer as a sidebar component:
|
|
122
|
+
|
|
123
|
+
```typescript
|
|
124
|
+
import { LogViewerPage } from 'hazo_logs/ui';
|
|
125
|
+
|
|
126
|
+
function AdminPanel() {
|
|
127
|
+
return (
|
|
128
|
+
<div className="flex">
|
|
129
|
+
<Sidebar />
|
|
130
|
+
<div className="flex-1">
|
|
131
|
+
<LogViewerPage
|
|
132
|
+
apiBasePath="/api/logs"
|
|
133
|
+
title="Recent Logs"
|
|
134
|
+
embedded={true}
|
|
135
|
+
showHeader={true}
|
|
136
|
+
className="h-screen"
|
|
137
|
+
/>
|
|
138
|
+
</div>
|
|
139
|
+
</div>
|
|
140
|
+
);
|
|
141
|
+
}
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
### Custom Authentication
|
|
145
|
+
|
|
146
|
+
Protect your log viewer with authentication:
|
|
147
|
+
|
|
148
|
+
```typescript
|
|
149
|
+
import { createLogApiHandler, withLogAuth } from 'hazo_logs/ui/server';
|
|
150
|
+
|
|
151
|
+
const handler = createLogApiHandler();
|
|
152
|
+
|
|
153
|
+
const authHandler = withLogAuth(handler, async (request) => {
|
|
154
|
+
const session = await getSession(request);
|
|
155
|
+
return session?.user?.role === 'admin';
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
export const { GET } = authHandler;
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
### Individual Components
|
|
162
|
+
|
|
163
|
+
Import components separately for custom layouts:
|
|
164
|
+
|
|
165
|
+
```typescript
|
|
166
|
+
import {
|
|
167
|
+
LogTable,
|
|
168
|
+
LogTimeline,
|
|
169
|
+
LogPagination,
|
|
170
|
+
LogLevelBadge,
|
|
171
|
+
} from 'hazo_logs/ui';
|
|
172
|
+
|
|
173
|
+
// Build your own custom log viewer
|
|
174
|
+
function CustomLogViewer() {
|
|
175
|
+
const [logs, setLogs] = useState([]);
|
|
176
|
+
|
|
177
|
+
return (
|
|
178
|
+
<div>
|
|
179
|
+
<LogTable logs={logs} isLoading={false} />
|
|
180
|
+
<LogPagination
|
|
181
|
+
currentPage={1}
|
|
182
|
+
totalPages={10}
|
|
183
|
+
pageSize={50}
|
|
184
|
+
total={500}
|
|
185
|
+
onPageChange={setPage}
|
|
186
|
+
onPageSizeChange={setPageSize}
|
|
187
|
+
/>
|
|
188
|
+
</div>
|
|
189
|
+
);
|
|
190
|
+
}
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
## Configuration Reference
|
|
194
|
+
|
|
195
|
+
Create `hazo_logs_config.ini` in your project root:
|
|
196
|
+
|
|
197
|
+
```ini
|
|
198
|
+
[hazo_logs]
|
|
199
|
+
# Core Logging Settings
|
|
200
|
+
log_directory = ./logs # Where to write log files
|
|
201
|
+
log_level = info # Minimum level: error, warn, info, debug
|
|
202
|
+
enable_console = true # Log to console
|
|
203
|
+
enable_file = true # Log to files with rotation
|
|
204
|
+
max_file_size = 20m # Max size per file (supports k, m, g)
|
|
205
|
+
max_files = 14d # Retention period (e.g., 14d = 14 days)
|
|
206
|
+
date_pattern = YYYY-MM-DD # Date format for log filenames
|
|
207
|
+
|
|
208
|
+
# Log Viewer UI Settings
|
|
209
|
+
enable_log_viewer = true # Enable the API endpoints
|
|
210
|
+
log_viewer_page_size = 50 # Results per page
|
|
211
|
+
log_viewer_max_results = 1000 # Max entries to load for filtering
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
If no config file is found, sensible defaults are used.
|
|
215
|
+
|
|
216
|
+
## API Reference
|
|
217
|
+
|
|
218
|
+
### Core Exports (`hazo_logs`)
|
|
219
|
+
|
|
220
|
+
#### `createLogger(packageName: string): Logger`
|
|
221
|
+
|
|
222
|
+
Create a package-specific logger.
|
|
223
|
+
|
|
224
|
+
```typescript
|
|
225
|
+
const logger = createLogger('my-package');
|
|
226
|
+
logger.info('Hello world');
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
#### `Logger` Interface
|
|
230
|
+
|
|
231
|
+
```typescript
|
|
232
|
+
interface Logger {
|
|
233
|
+
error(message: string, data?: Record<string, unknown>): void;
|
|
234
|
+
warn(message: string, data?: Record<string, unknown>): void;
|
|
235
|
+
info(message: string, data?: Record<string, unknown>): void;
|
|
236
|
+
debug(message: string, data?: Record<string, unknown>): void;
|
|
237
|
+
}
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
#### `runWithLogContext(context: LogContext, fn: () => Promise<T>): Promise<T>`
|
|
241
|
+
|
|
242
|
+
Run code with log context (sessionId, reference, depth).
|
|
243
|
+
|
|
244
|
+
#### `readLogs(options): Promise<LogQueryResult>`
|
|
245
|
+
|
|
246
|
+
Read logs from files with filtering and pagination (server-side only).
|
|
247
|
+
|
|
248
|
+
### UI Exports (`hazo_logs/ui`)
|
|
249
|
+
|
|
250
|
+
#### `LogViewerPage`
|
|
251
|
+
|
|
252
|
+
Main log viewer component.
|
|
253
|
+
|
|
254
|
+
**Props:**
|
|
255
|
+
- `apiBasePath?: string` - API endpoint path (default: `/api/logs`)
|
|
256
|
+
- `title?: string` - Page title (default: `Log Viewer`)
|
|
257
|
+
- `className?: string` - Additional CSS classes
|
|
258
|
+
- `embedded?: boolean` - Embedded mode (default: `false`)
|
|
259
|
+
- `showHeader?: boolean` - Show header (default: `true`)
|
|
260
|
+
|
|
261
|
+
#### Individual Components
|
|
262
|
+
|
|
263
|
+
- `LogTable` - Table view of logs
|
|
264
|
+
- `LogTimeline` - Timeline view with grouping
|
|
265
|
+
- `LogPagination` - Pagination controls
|
|
266
|
+
- `LogLevelBadge` - Badge for log levels
|
|
267
|
+
|
|
268
|
+
### Server Exports (`hazo_logs/ui/server`)
|
|
269
|
+
|
|
270
|
+
#### `createLogApiHandler(config?): LogApiHandler`
|
|
271
|
+
|
|
272
|
+
Create Next.js API route handler.
|
|
273
|
+
|
|
274
|
+
**Options:**
|
|
275
|
+
- `logDirectory?: string` - Override default log directory
|
|
276
|
+
|
|
277
|
+
**Returns:**
|
|
278
|
+
```typescript
|
|
279
|
+
{
|
|
280
|
+
GET: (request: Request) => Promise<Response>
|
|
281
|
+
}
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
#### `withLogAuth(handler, authCheck): LogApiHandler`
|
|
285
|
+
|
|
286
|
+
Wrap handler with authentication.
|
|
287
|
+
|
|
288
|
+
```typescript
|
|
289
|
+
const authHandler = withLogAuth(handler, async (request) => {
|
|
290
|
+
// Return true to allow access, false to deny
|
|
291
|
+
return await isAdmin(request);
|
|
292
|
+
});
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
## Log File Format
|
|
296
|
+
|
|
297
|
+
Logs are stored as newline-delimited JSON:
|
|
298
|
+
|
|
299
|
+
```json
|
|
300
|
+
{"timestamp":"2025-12-18T10:30:45.123Z","level":"info","package":"auth","message":"User logged in","filename":"auth.ts","line":42,"executionId":"2025-12-18-10:30:45-1234","sessionId":"sess_abc123","reference":"user-456","data":{"userId":456}}
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
**Fields:**
|
|
304
|
+
- `timestamp` - ISO 8601 timestamp
|
|
305
|
+
- `level` - Log level (error, warn, info, debug)
|
|
306
|
+
- `package` - Package name from createLogger
|
|
307
|
+
- `message` - Log message
|
|
308
|
+
- `filename` - Source file name
|
|
309
|
+
- `line` - Line number in source file
|
|
310
|
+
- `executionId` - Unique ID per server start
|
|
311
|
+
- `sessionId` - Optional session ID from context
|
|
312
|
+
- `reference` - Optional reference from context
|
|
313
|
+
- `depth` - Optional call depth from context
|
|
314
|
+
- `data` - Optional additional data
|
|
315
|
+
|
|
316
|
+
## UI Screenshots
|
|
317
|
+
|
|
318
|
+
### Table View
|
|
319
|
+
Filter and sort logs by level, package, session, execution ID, or search text.
|
|
320
|
+
|
|
321
|
+
### Timeline View
|
|
322
|
+
Visualize logs grouped by package or session with hierarchical depth display.
|
|
323
|
+
|
|
324
|
+
## Examples
|
|
325
|
+
|
|
326
|
+
See the `test-app/` directory for a complete working example.
|
|
327
|
+
|
|
328
|
+
## Contributing
|
|
329
|
+
|
|
330
|
+
Contributions are welcome! Please:
|
|
331
|
+
|
|
332
|
+
1. Fork the repository
|
|
333
|
+
2. Create a feature branch (`git checkout -b feature/amazing-feature`)
|
|
334
|
+
3. Commit your changes (`git commit -m 'Add amazing feature'`)
|
|
335
|
+
4. Push to the branch (`git push origin feature/amazing-feature`)
|
|
336
|
+
5. Open a Pull Request
|
|
337
|
+
|
|
338
|
+
### Development Setup
|
|
339
|
+
|
|
340
|
+
```bash
|
|
341
|
+
# Clone the repo
|
|
342
|
+
git clone https://github.com/pub12/hazo_logs.git
|
|
343
|
+
cd hazo_logs
|
|
344
|
+
|
|
345
|
+
# Install dependencies
|
|
346
|
+
npm install
|
|
347
|
+
|
|
348
|
+
# Run tests
|
|
349
|
+
npm test
|
|
350
|
+
|
|
351
|
+
# Build
|
|
352
|
+
npm run build
|
|
353
|
+
|
|
354
|
+
# Test with example app
|
|
355
|
+
npm run dev:test-app
|
|
356
|
+
```
|
|
357
|
+
|
|
358
|
+
## License
|
|
359
|
+
|
|
360
|
+
MIT - See LICENSE file for details
|
|
361
|
+
|
|
362
|
+
## Author
|
|
363
|
+
|
|
364
|
+
Pubs Abayasiri
|
|
365
|
+
|
|
366
|
+
## Links
|
|
367
|
+
|
|
368
|
+
- [GitHub Repository](https://github.com/pub12/hazo_logs)
|
|
369
|
+
- [Issue Tracker](https://github.com/pub12/hazo_logs/issues)
|
|
370
|
+
- [NPM Package](https://www.npmjs.com/package/hazo_logs)
|
|
371
|
+
|
|
372
|
+
## Related Packages
|
|
373
|
+
|
|
374
|
+
- [hazo_ui](https://github.com/pub12/hazo_ui) - UI component library (required for log viewer)
|
|
375
|
+
|
|
376
|
+
## Support
|
|
377
|
+
|
|
378
|
+
For issues and questions:
|
|
379
|
+
- Open an issue on [GitHub](https://github.com/pub12/hazo_logs/issues)
|
|
380
|
+
- Check existing issues for solutions
|
package/package.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "hazo_logs",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.1",
|
|
4
4
|
"description": "Logger for hazo packages - Winston wrapper with singleton pattern",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
|
-
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
8
|
"exports": {
|
|
9
9
|
".": {
|
|
10
10
|
"types": "./dist/index.d.ts",
|