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.
Files changed (2) hide show
  1. package/README.md +380 -0
  2. 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
+ [![npm version](https://img.shields.io/npm/v/hazo_logs.svg)](https://www.npmjs.com/package/hazo_logs)
6
+ [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](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.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
- "types": "dist/index.d.ts",
7
+ "types": "dist/index.d.ts",
8
8
  "exports": {
9
9
  ".": {
10
10
  "types": "./dist/index.d.ts",