Universal logging library for Node.js - One API, multiple databases, pure ESM
Log to MongoDB, PostgreSQL, MySQL, Firebase, or any database with a unified, simple API using modern ES Modules.
- π― Universal API - One interface for all databases
- π¦ Multiple Adapters - File, MongoDB, PostgreSQL, MySQL, Firebase
- π File Adapter - No database required! Log to local files with rotation
- π Auto Sanitization - Masks passwords, tokens, emails automatically
- π¨ Pure ESM - Modern ES Modules (
import/export) - π¨ TypeScript - Full type safety
- β‘ Zero Dependencies - File adapter has NO dependencies!
- π 5 Log Levels - ERROR, WARN, INFO, DEBUG, TRACE
- π Powerful Queries - Filter by user, date, level, text search
- π Environment Aware - dev/staging/production
- π Console Output - Beautiful colored console logs
- π Production Ready - Battle-tested
# npm
npm install logger-multi-db
# yarn
yarn add logger-multi-db
# pnpm
pnpm add logger-multi-dbThen install your database adapter:
# MongoDB
npm install mongodb
# PostgreSQL
npm install pg
npm i --save-dev @types/pg
# MySQL
npm install mysql2
# Firebase
npm install firebase-adminimport { createLogger, createFileAdapter, LogLevel } from "logger-multi-db";
const logger = createLogger({
adapter: createFileAdapter({
logDir: "./logs",
filename: "app.log",
maxSize: 5 * 1024 * 1024, // 5MB
maxFiles: 3,
format: "json", // or 'text'
}),
service: "my-app",
minLevel: LogLevel.INFO,
});
await logger.init();
logger.info("Application started", { version: "1.0.0" });
logger.error("Something went wrong", { userId: "123" }, new Error("Oops!"));
// Query logs from files
const recentErrors = await logger.query({
level: LogLevel.ERROR,
limit: 10,
});import { createLogger, LogLevel } from "logger-multi-db";
import { createMongoDBAdapter } from "logger-multi-db/adapters/mongodb";
const logger = createLogger({
adapter: createMongoDBAdapter({
uri: "mongodb://localhost:27017",
dbName: "myapp",
collectionName: "logs",
ttlDays: 30,
}),
service: "api",
environment: "production",
});
await logger.init();
logger.info("User logged in", { userId: "123", email: "user@example.com" });
logger.error("Payment failed", { amount: 50 }, new Error("Stripe timeout"));import { createLogger } from "logger-multi-db";
import { createPostgreSQLAdapter } from "logger-multi-db/adapters/postgresql";
const logger = createLogger({
adapter: createPostgreSQLAdapter({
host: "localhost",
database: "myapp",
user: "postgres",
password: "password",
}),
service: "web",
});
await logger.init();
logger.info("Order created", { orderId: "456", amount: 99.99 });import { createLogger } from "logger-multi-db";
import { createMySQLAdapter } from "logger-multi-db/adapters/mysql";
const logger = createLogger({
adapter: createMySQLAdapter({
host: "localhost",
database: "myapp",
user: "root",
password: "password",
}),
service: "backend",
});
await logger.init();
logger.warn("Low stock", { productId: "789", stock: 5 });import { createLogger } from "logger-multi-db";
import { createFirebaseAdapter } from "logger-multi-db/adapters/firebase";
const logger = createLogger({
adapter: createFirebaseAdapter({
serviceAccount: "./serviceAccountKey.json",
collectionName: "logs",
}),
service: "mobile-app",
});
await logger.init();
logger.info("User signup", { userId: "123", provider: "google" });import { createLogger, LogLevel } from "logger-multi-db";
const logger = createLogger({
adapter, // Database adapter (required)
environment: "prod", // Environment
service: "api", // Service name
enableConsole: true, // Console logging
minLevel: LogLevel.INFO, // Minimum level (use LogLevel enum)
sanitize: true, // Auto-sanitize
});// Log levels
logger.error(message, context?, error?)
logger.warn(message, context?)
logger.info(message, context?)
logger.debug(message, context?)
logger.trace(message, context?)
// Initialize
await logger.init()
// Query logs
const logs = await logger.query({
level: LogLevel.ERROR,
userId: 'user123',
startDate: new Date('2024-01-01'),
limit: 100
})
// Close
await logger.close()Sensitive data is automatically masked:
logger.info("Login attempt", {
email: "jordan@example.com", // β jor***@example.com
password: "supersecret123", // β ***REDACTED***
apiKey: "sk_live_12345", // β ***REDACTED***
userId: "user123", // β
Not masked
});Default masked fields:
- password, token, apiKey, secret
- creditCard, ssn, bankAccount
- privateKey, accessToken, refreshToken
- email (partially masked)
import { randomUUID } from "crypto";
const requestId = randomUUID();
logger.info("Request started", { requestId, url: "/api/users" });
// ... processing ...
logger.info("Request completed", { requestId, duration: 150 });
// Find all logs for this request
const logs = await logger.query({ requestId });// Track orders
logger.info("Order created", {
orderId: order.id,
userId: user.id,
amount: order.total,
});
// Track payments
logger.info("Payment processed", {
orderId: order.id,
transactionId: payment.id,
});try {
await processPayment(data);
} catch (error) {
logger.error(
"Payment error",
{
userId: user.id,
amount: data.amount,
},
error
);
}Switch from MongoDB to PostgreSQL? Just change the adapter:
// Before: MongoDB
const adapter = createMongoDBAdapter({ uri: "..." });
// After: PostgreSQL
const adapter = createPostgreSQLAdapter({ host: "..." });
// Your logging code stays the same!
logger.info("Works!", { userId: "123" });Full TypeScript support:
import {
createLogger,
LogLevel, // Enum (not a type)
type LogEntry, // Type
type LogContext, // Type
type LogFilter, // Type
} from "logger-multi-db";
import {
createMongoDBAdapter,
type MongoDBAdapterConfig,
} from "logger-multi-db/adapters/mongodb";
const config: MongoDBAdapterConfig = {
uri: "mongodb://localhost:27017",
dbName: "myapp",
};
// Use LogLevel as a value
const logger = createLogger({
adapter: createMongoDBAdapter(config),
minLevel: LogLevel.INFO, // β
Correct
});Beautiful colored console logs:
π΄ [ERROR] 2024-11-29T10:30:00.000Z [api] Payment failed {"userId":"123"}
β Stripe timeout
Disable in production:
const logger = createLogger({
adapter,
enableConsole: process.env.NODE_ENV !== "production",
});Contributions welcome! See CONTRIBUTING.md
MIT Β© [Jordan (Tech converter)]
Made with β€οΈ using modern ES Modules