@kingdiablo/auditor
Version:
A lightweight and customizable audit logger for Node.js apps. Tracks database changes, errors, and user actions with support for external loggers like Winston or Pino.
374 lines (263 loc) âĸ 12.3 kB
Markdown
# đĄī¸ Auditor
Auditor is a lightweight, type-safe, and framework-agnostic audit logger for Node.js. It provides:
- Request and error logging middleware for **Express**, **Fastify**, and **Koa**
- Type-safe business event logging
- Current flexible log destinations (console, file) with remote coming soon
- **Database audit logging for Mongoose (MongoDB)** with others planned
## đĻ Installation
```bash
npm install @kingdiablo/auditor
```
You can also install and use your preferred logger and optionally an ORM:
```bash
npm install winston mongoose
```
## âšī¸ Quick Start (v0.3.0+)
> **Note:** After creating an `Auditor` instance, you **must** call `.Setup()` before using any middleware or logging features. This step is required for proper initialization.
### Express
```ts
import { Auditor } from '@kingdiablo/auditor';
import express from 'express';
const audit = new Auditor({ framework: 'express' });
await audit.Setup(); // <--- Required! Must be called after creating the Auditor instance
const app = express();
app.use(audit.RequestLogger());
app.use(audit.ErrorLogger());
```
### Fastify
```ts
import { Auditor } from '@kingdiablo/auditor';
import Fastify from 'fastify';
const audit = new Auditor({ framework: 'fastify' });
await audit.Setup(); // <--- Required! Must be called after creating the Auditor instance
const fastify = Fastify();
fastify.addHook('onRequest', audit.RequestLogger().onRequest);
fastify.addHook('onResponse', audit.RequestLogger().onResponse);
// For error logging, use fastify.setErrorHandler(audit.ErrorLogger());
```
### Koa
```ts
import { Auditor } from '@kingdiablo/auditor';
import Koa from 'koa';
const audit = new Auditor({ framework: 'koa' });
await audit.Setup(); // <--- Required! Must be called after creating the Auditor instance
const app = new Koa();
app.use(audit.RequestLogger());
// For error logging, use app.use(audit.ErrorLogger());
```
## đĨī¸ Using the Audit UI (Express, Fastify and Koa)
Auditor supports a built-in UI to view audit logs. To enable the UI, set the `useUI` option to `true` when creating the `Auditor` instance. This will download necessary UI dependencies and provide routes to serve the UI and logs.
### Express UI Setup
```ts
import { Auditor } from '@kingdiablo/auditor';
import express from 'express';
const audit = new Auditor({ framework: 'express', useUI: true });
await audit.Setup();
const app = express();
app.use(audit.RequestLogger());
app.use(audit.ErrorLogger());
// Mount the audit UI routes
if (audit.CreateUI) {
const auditUI = await audit.CreateUI();
app.use(auditUI);
}
```
### Fastify UI Setup
```ts
import { Auditor } from '@kingdiablo/auditor';
import Fastify from 'fastify';
const audit = new Auditor({ framework: 'fastify', useUI: true });
await audit.Setup();
const fastify = Fastify();
fastify.addHook('onRequest', audit.RequestLogger().onRequest);
fastify.addHook('onResponse', audit.RequestLogger().onResponse);
fastify.setErrorHandler(audit.ErrorLogger());
// Mount the audit UI routes
const auditUI = await audit.CreateUI();
fastify.register(auditUI);
fastify.listen(3000, () => {
console.log('Server running on http://localhost:3000');
});
```
### Koa UI Setup
```ts
import { Auditor } from '@kingdiablo/auditor';
import Koa from 'koa';
const audit = new Auditor({ framework: 'koa', useUI: true });
await audit.Setup();
const app = new Koa();
app.use(audit.RequestLogger());
app.use(audit.ErrorLogger());
// Mount the audit UI routes
const auditUI = await audit.CreateUI();
app.use(auditUI);
app.listen(3000, () => {
console.log('Server running on http://localhost:3000');
});
```
The UI will be available at `/audit-ui` and audit logs can be fetched from `/audit-log`.
## đ Configuring File Logging (SetFileConfig)
To customize the file logging location or filename, use the `SetFileConfig` method after creating your Auditor instance. This is useful if you want to store logs in a specific folder or use a custom log file name.
**Requirements:**
- The `file` destination must be enabled in your Auditor config.
- `SetFileConfig` will not work if `splitFiles` is set to `true`.
```ts
const audit = new Auditor({
destinations: ['file'],
});
audit.Setup(); // <--- Required! Must be called after creating the Auditor instance
// Configure file logging location and filename
// This will store logs in './logs/my-audit.log'
audit.SetFileConfig({
folderName: 'logs',
fileName: 'my-audit', // Do not include .log extension; it will be added automatically
});
```
- `folderName`: The folder where logs will be stored (default: `audit`)
- `fileName`: The name of the log file (default: `audit`)
If you do not call `SetFileConfig`, logs will be written to `./audit/audit.log` by default.
## đ ī¸ Configuration
You can create an Auditor instance with zero configuration for quick prototyping or testing:
```ts
const audit = new Auditor(); // Defaults to Express, console logging
audit.Setup(); // <--- Required! Must be called after creating the Auditor instance
```
Or pass options to customize the logger, destinations, database type, timestamp usage, and split file logging:
```ts
const audit = new Auditor({
logger: myLogger, // e.g., Winston or Pino instance
destinations: ['console', 'file'],
dbType: 'mongoose',
useTimeStamp: true, // optional, default is true
splitFiles: true, // Logs to error.log, request.log, db.log, and action.log in the 'audits' folder
framework: 'fastify', // or 'koa', 'express'
useUI: true, // Enable the audit UI
});
audit.Setup(); // <--- Required! Must be called after creating the Auditor instance
```
## đ Features
- **Multi-framework support:** Express, Fastify, and Koa middleware out of the box
- **Automatic MongoDB audit logging** (Mongoose): Track create, update, delete, and find operations on your models
- **User context utilities:** Capture userId, endpoint, IP, and user agent for every log entry (see below for details)
- **Split file logging:** Separate logs for errors, requests, DB actions, and business events
- **Type-safe business event logging** with IntelliSense
- **Pluggable logging backends** (Console, Winston, Pino, etc.)
- **Configurable log destinations:** console, file
- **System error & signal logging:** Optionally log uncaught exceptions, unhandled rejections, SIGTERM, SIGINT, and process exit events (see `captureSystemErrors`)
- **Manual error logging:** Log errors directly using `audit.LogError(error)`
- **Mongoose schema auditing:** Enable DB operation auditing for any Mongoose schema with `audit.AuditModel(schema)`
## â Configuration Options
| Option | Type | Default | Description |
| --------------------- | -------- | ------------- | --------------------------------------------------------------------------------------- |
| `logger` | any | `console` | Your custom logger instance (Winston, Pino, etc) |
| `destinations` | string[] | `["console"]` | Where to send logs (`console`, `file`) |
| `dbType` | string | `'none'` | Supported DBs: `'mongoose'` |
| `useTimeStamp` | boolean | `true` | Include timestamp in logs |
| `splitFiles` | boolean | `false` | Log to separate files for errors, requests, db, actions |
| `framework` | string | `'express'` | `'express'`, `'fastify'`, or `'koa'` |
| `captureSystemErrors` | boolean | `false` | Log uncaught exceptions, unhandled rejections, SIGTERM, SIGINT, and process exit events |
| `useUI` | boolean | `false` | Enable the audit UI |
**Split file logging:**
- When `splitFiles: true`, logs are written to `audits/error.log`, `audits/request.log`, `audits/db.log`, and `audits/action.log`.
- Otherwise, all logs go to a single file (default: `audit/audit.log`).
**System error logging:**
- If `captureSystemErrors: true`, Auditor will log uncaught exceptions, unhandled promise rejections, SIGTERM, SIGINT, and process exit events to your error log.
**Behavior if not initialized:**
- If you forget to call `.Setup()`, log methods will warn you and may not function as expected.
## đĒĩ Business Event Logging (`Log`)
The `Log` method allows you to record business events, security actions, or any custom audit event in a type-safe way. It provides IntelliSense for event types and actions.
**Example:**
```ts
audit.Log({
type: 'auth', // IntelliSense: 'auth', 'billing', 'system', 'error', ...
action: 'login', // IntelliSense: 'login', 'logout', ...
message: 'User logged in successfully.',
});
```
You can extend the available types and actions to fit your business needs, and TypeScript will provide suggestions and catch typos.
**Custom event example:**
```ts
audit.Log({
type: 'custom_event',
action: 'something_happened',
message: 'A custom event occurred.',
});
```
## đ Manual Error Logging (`LogError`)
You can manually log errors (outside of middleware) using the `LogError` method:
```ts
try {
// ...some code that might throw
} catch (err) {
audit.LogError(err);
}
```
This will log the error to all configured destinations, including stack trace and user context if available.
## đī¸ Mongoose Schema Auditing (`AuditModel`)
To enable automatic auditing of database operations on a Mongoose schema, call `AuditModel` after defining your schema:
```ts
import mongoose from 'mongoose';
import { Auditor } from '@kingdiablo/auditor';
const audit = new Auditor({ dbType: 'mongoose' });
audit.Setup();
const userSchema = new mongoose.Schema({
/* ... */
});
audit.AuditModel(userSchema); // <-- enables auditing for this schema
```
## â ī¸ Error Logger Middleware (`ErrorLogger`)
The `ErrorLogger` middleware automatically captures and logs errors that occur during request handling in your app.
**Usage:**
```ts
// Express
app.use(audit.ErrorLogger());
// Fastify: fastify.setErrorHandler(audit.ErrorLogger());
// Koa: app.use(audit.ErrorLogger());
```
**How to include userId in error logs:**
If your request object has a `user` property with an `id` field, it will be included in the log entry. Adjust your authentication middleware as needed.
## đ Request Logger Middleware (`RequestLogger`)
The `RequestLogger` middleware tracks every incoming HTTP request and logs useful details for auditing and performance monitoring.
**Usage:**
```ts
// Express
app.use(audit.RequestLogger());
// Fastify: fastify.addHook('onRequest', audit.RequestLogger().onRequest);
// fastify.addHook('onResponse', audit.RequestLogger().onResponse);
// Koa: app.use(audit.RequestLogger());
```
## đ§ Roadmap & Planned Features
- [x] Core audit logger class
- [x] Request and error middleware for Express, Fastify, Koa
- [x] File-based JSON logging
- [x] **Database audit** â log database operations for Mongoose (MongoDB)
- [x] Audit UI support for Express, Fastify, and Koa
- [ ] Prisma and Sequelize support (planned)
- [ ] Remote logging transport (planned)
- [ ] More configuration options: log rotation, custom transports (planned)
## đ Changelog
See the [CHANGELOG.md](./CHANGELOG.md) for a detailed list of releases, new features, bug fixes, and planned improvements.
## đ License
MIT
## đ Contributing
PRs and feature requests are welcome!
git clone https://github.com/kingdiablo/auditor
cd auditor
npm install
npm run dev