this is a lightweight, type-safe, and framework-agnostic backend auditing system for Node.js β not just another logger.
It enables structured auditing of:
- Request and response activity
- Application-level events (e.g. user logins, deletions)
- Errors and exceptions
- Database operations with Mongoose and Prisma
- Optional remote logging via BetterStack
- Optional UI dashboard for inspecting audit logs
Auditor helps provide observability, traceability, and accountability for your backend services.
npm install @kingdiablo/auditorYou can also install and use your preferred logger and optionally an ORM:
npm install winston mongooseNote: After creating an
Auditorinstance, you must call.Setup()before using any middleware or logging features.
import { Auditor } from '@kingdiablo/auditor';
import express from 'express';
const audit = new Auditor({ framework: 'express' });
await audit.Setup();
const app = express();
app.use(audit.RequestLogger());
app.use(audit.ErrorLogger());import { Auditor } from '@kingdiablo/auditor';
import Fastify from 'fastify';
const audit = new Auditor({ framework: 'fastify' });
await audit.Setup();
const fastify = Fastify();
fastify.addHook('onRequest', audit.RequestLogger().onRequest);
fastify.addHook('onResponse', audit.RequestLogger().onResponse);
fastify.setErrorHandler(audit.ErrorLogger());import { Auditor } from '@kingdiablo/auditor';
import Koa from 'koa';
const audit = new Auditor({ framework: 'koa' });
await audit.Setup();
const app = new Koa();
app.use(audit.RequestLogger());
app.use(audit.ErrorLogger());Auditor provides an optional self-hosted UI to view and explore audit logs. To enable it, set useUI: true. Dependencies are downloaded at runtime β no CDN used.
const audit = new Auditor({ framework: 'express', useUI: true });
await audit.Setup();
if (audit.CreateUI) {
const auditUI = await audit.CreateUI();
app.use(auditUI);
}const audit = new Auditor({ framework: 'fastify', useUI: true });
await audit.Setup();
const auditUI = await audit.CreateUI();
fastify.register(auditUI);
fastify.listen(3000, () => {
console.log('Server running on http://localhost:3000');
});const audit = new Auditor({ framework: 'koa', useUI: true });
await audit.Setup();
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 logs can be fetched from /audit-log.
The audit UI includes built-in security measures to protect sensitive audit logs:
- Login Required: All UI routes require authentication
- Session Management: Uses secure HTTP-only cookies
- Secret Key: Requires a secret key for session validation
/auth-ui- Login page (unauthenticated)/login- Authentication endpoint (POST)/logout- Session termination/audit-ui- Main dashboard (authenticated only)/audit-log- API endpoint for logs (authenticated only)
// Configure UI security when creating the audit instance
const audit = new Auditor({
framework: 'express',
useUI: true,
// Security credentials
uiCredentials: {
username: 'admin', // Default: 'admin'
password: 'securepass', // Default: 'admin'
secret: 'your-secret-key', // Required for session validation
},
});- HTTP-only cookies: Prevents XSS attacks
- SameSite=strict: CSRF protection
- Secure flag: HTTPS enforcement (configurable)
- Session timeout: 1 hour expiration
- Base64 encoding: Credentials are encoded but not encrypted
- Route protection: All sensitive routes require valid session
- Automatic redirects: Unauthorized users redirected to login
- Error handling: Returns 403 Forbidden for unauthorized access
- Change default credentials: Always update from default 'admin/admin'
- Use strong secrets: Generate cryptographically secure secret keys
- HTTPS in production: Enable secure cookies in production
- Environment variables: Store credentials in environment variables
- Regular rotation: Change credentials periodically
const audit = new Auditor({
framework: 'express',
useUI: true,
uiCredentials: {
username: process.env.AUDIT_USERNAME || 'admin',
password: process.env.AUDIT_PASSWORD || 'admin',
secret: process.env.AUDIT_SECRET || 'default-secret-change-me',
},
});const audit = new Auditor({ destinations: ['file'] });
await audit.Setup();
audit.SetFileConfig({
folderName: 'logs',
fileName: 'my-audit',
});Default values:
folderName:auditfileName:audit
const audit = new Auditor({
logger: myLogger,
destinations: ['console', 'file', 'remote'],
dbType: 'mongoose',
useTimeStamp: true,
splitFiles: true,
framework: 'fastify',
useUI: true,
remote: {
provider: 'betterstack',
apiKey: process.env.BETTERSTACK_API_KEY,
sourceId: process.env.BETTERSTACK_SOURCE_ID,
},
});
await audit.Setup();- Multi-framework support
- Request/error middleware
- File-based JSON logging
- Remote logging via BetterStack
- Database audit logging (Mongoose + Prisma)
- Manual structured business event logging
- Split file logging per log type
- Pluggable logger support (Winston, Pino, Console)
- Optional system error capture
- Optional UI dashboard
| Option | Type | Default | Description |
|---|---|---|---|
logger |
any | console |
Custom logger instance (Winston, Pino, etc) |
destinations |
string[] | ['console'] |
Where to write logs (console, file, remote) |
dbType |
string | 'none' |
'mongoose' or 'prisma' |
useTimeStamp |
boolean | true |
Adds timestamps to logs |
splitFiles |
boolean | false |
Split logs into separate files |
framework |
string | 'express' |
'express', 'fastify', 'koa' |
captureSystemErrors |
boolean | false |
Capture uncaught exceptions/signals |
useUI |
boolean | false |
Serve the frontend dashboard |
remote |
object | undefined |
Configuration for BetterStack |
Use Log to track user actions and meaningful server events.
β οΈ Auditor cannot automatically track user-level actions β you must log them explicitly.
audit.Log({
type: 'auth',
action: 'login',
status: 'success',
actor: 'admin',
message: 'User logged in successfully.',
meta: { userId: 'abc123' },
});Custom types/actions are supported:
audit.Log({
type: 'custom_event',
action: 'something_happened',
status: 'info',
message: 'A custom event occurred.',
});try {
// ...some code
} catch (err) {
audit.LogError(err);
}import mongoose from 'mongoose';
import { Auditor } from '@kingdiablo/auditor';
const audit = new Auditor({ dbType: 'mongoose' });
await audit.Setup();
const userSchema = new mongoose.Schema({
// schema fields...
});
audit.AuditModel(userSchema);npm install @prisma/clientimport { Auditor } from '@kingdiablo/auditor';
import { PrismaClient } from '@prisma/client';
const prisma = new PrismaClient();
const audit = new Auditor({ dbType: 'prisma' });
await audit.Setup();
audit.AuditModel(prisma);// Express
app.use(audit.RequestLogger());
// Fastify
fastify.addHook('onRequest', audit.RequestLogger().onRequest);
fastify.addHook('onResponse', audit.RequestLogger().onResponse);
// Koa
app.use(audit.RequestLogger());// Express
app.use(audit.ErrorLogger());
// Fastify
fastify.setErrorHandler(audit.ErrorLogger());
// Koa
app.use(audit.ErrorLogger());| Feature | Setup Required | Default State | Usage |
|---|---|---|---|
| Log Retention & File Rotation | β Optional | Disabled | Automatic cleanup of old logs |
| Log File Splitting | β Optional | Disabled | Separate logs by type |
| Archive Cleanup | β Automatic | Automatic | Auto-cleanup old archives (if max retention is active ) |
- Automatically rotates log files when they exceed size limits
- Archives old logs to
/logs/archive/ - Cleans up archives older than configured days
import { Auditor } from '@kingdiablo/auditor';
const audit = new Auditor({
destinations: ['file'],
maxRetention: 7, // Keep logs for 7 days
splitFiles: true, // Enable file splitting
});
await audit.Setup();
audit.SetFileConfig({
folderName: 'logs',
fileName: 'my-app',
});- Logs will auto-rotate when > 5MB
- Archives stored in
logs/archive/ - Cleanup runs daily at midnight
-
Splits logs into separate files by type:
request.log- HTTP requestserror.log- Errors/exceptionsdb.log- Database operationsaudit.log- General audit events
const audit = new Auditor({
destinations: ['file'],
splitFiles: true, // Enable splitting
});
await audit.Setup();logs/
βββ my-app-request.log
βββ my-app-error.log
βββ my-app-db.log
βββ my-app-audit.log
βββ archive/
βββ my-app_2024-01-15_12-00-00.log
βββ ...
- Automatically deletes archived logs older than configured days
- Runs during log rotation
const audit = new Auditor({
maxRetention: 30, // Delete archives older than 30 days
});See the CHANGELOG.md for full release notes.
See the REMOTE_LOGGING.md for setup and usage.
MIT
Contributions welcome! See CONTRIBUTING.md for guidelines.