
Security News
Ruby's Bundler 4.0.18 Extends Cooldown to bundle lock and bundle cache
The supply chain control that delays freshly published gems now covers lockfile generation and gem vendoring in Ruby projects.
@deepracticex/logger
Advanced tools
Universal logging system for all JavaScript runtimes - Node.js, Cloudflare Workers, Browser, and more.
pnpm add @deepracticex/logger
Choose the right entry point for your platform:
// Uses Pino for high performance logging
import { createLogger } from "@deepracticex/logger";
// or explicitly
import { createLogger } from "@deepracticex/logger/nodejs";
const logger = createLogger({
level: "info",
name: "my-service",
console: true,
file: true, // File logging with daily rotation
});
logger.info("Server started");
// Uses lightweight console adapter (no Node.js dependencies)
import { createLogger } from "@deepracticex/logger/cloudflare-workers";
const logger = createLogger({
level: "info",
name: "my-worker",
console: true,
});
logger.info("Request handled");
// Uses browser-optimized console adapter
import { createLogger } from "@deepracticex/logger/browser";
const logger = createLogger({
level: "debug",
name: "my-app",
console: true,
colors: true,
});
logger.info("App initialized");
// Uses in-memory test adapter with log capture
import {
createLogger,
getTestLogs,
clearTestLogs,
} from "@deepracticex/logger/test";
const logger = createLogger({
level: "debug",
name: "my-service",
console: false, // Silent by default in tests
});
// Your test code
logger.info("test message");
// Assert logs were captured
const logs = getTestLogs();
expect(logs).toHaveLength(1);
expect(logs[0].message).toBe("test message");
// Clean up between tests
clearTestLogs();
import { info, warn, error, debug } from "@deepracticex/logger";
info("Server started");
warn("Low memory");
error("Connection failed");
debug("Debug info");
import { createLogger } from "@deepracticex/logger";
const logger = createLogger({
level: "debug",
name: "@deepracticex/my-service",
console: true,
file: {
dirname: "/var/log/myapp",
},
colors: true,
});
logger.info("Custom logger initialized");
interface LoggerConfig {
// Log level (default: 'info')
level?: "fatal" | "error" | "warn" | "info" | "debug" | "trace";
// Package/service name (default: 'app')
name?: string;
// Console output (default: true)
console?: boolean;
// File logging - Node.js only (default: false)
file?:
| boolean
| {
dirname?: string; // Log directory (default: ~/.deepractice/logs)
};
// Color support (default: true, auto-disabled in MCP stdio)
colors?: boolean;
}
LOG_LEVEL - Set log level (default: 'info')MCP_TRANSPORT=stdio - Auto-disable colors for MCP stdio modeDEEPRACTICE_NO_WORKERS=true - Force sync mode (useful for Electron)fatal - Critical errors that require immediate attentionerror - Errors that need to be fixedwarn - Warnings about potential issuesinfo - General information (default)debug - Detailed debug informationtrace - Very verbose trace informationUses Pino for high-performance logging:
File Structure:
~/.deepractice/logs/
├── deepractice-2025-10-13.log # All logs
└── deepractice-error-2025-10-13.log # Error logs only
Uses lightweight console adapter:
Uses browser-optimized console adapter:
Uses in-memory test adapter:
VITEST=true or NODE_ENV=test)getTestLogs(), clearTestLogs(), getTestLogsByLevel()Usage in tests:
import {
createLogger,
getTestLogs,
clearTestLogs,
} from "@deepracticex/logger/test";
describe("my feature", () => {
const logger = createLogger();
afterEach(() => {
clearTestLogs(); // Clean up between tests
});
it("should log messages", () => {
logger.info("test started");
logger.warn("warning message");
const logs = getTestLogs();
expect(logs).toHaveLength(2);
expect(logs[0].level).toBe("info");
});
});
Auto-detection:
When running in vitest, the default @deepracticex/logger import automatically uses the test adapter:
// Automatically uses test adapter in vitest
import { createLogger } from "@deepracticex/logger";
const logger = createLogger(); // No console output in tests
Enable console output for debugging:
// Show logs in test output
const logger = createLogger({ console: true });
// Or run with verbose reporter
// pnpm test -- --reporter=verbose
import { createLogger } from "@deepracticex/logger";
const logger = createLogger({
level: process.env.LOG_LEVEL || "info",
name: "@deepracticex/api-server",
console: true,
file: {
dirname: "./logs",
},
});
logger.info({ port: 3000 }, "Server started");
logger.error({ err: error }, "Database connection failed");
import { createLogger } from "@deepracticex/logger/cloudflare-workers";
export default {
async fetch(request: Request, env: Env): Promise<Response> {
const logger = createLogger({
name: "my-worker",
level: env.LOG_LEVEL || "info",
});
logger.info({ url: request.url }, "Request received");
try {
// Handle request
return new Response("OK");
} catch (error) {
logger.error({ error }, "Request failed");
return new Response("Error", { status: 500 });
}
},
};
import { createLogger } from "@deepracticex/logger/browser";
const logger = createLogger({
name: "my-app",
level: "debug",
colors: true,
});
logger.info("App initialized");
document.addEventListener("click", (e) => {
logger.debug({ target: e.target }, "User clicked");
});
The logger uses a multi-adapter architecture with automatic runtime detection:
Platform-specific entry points ensure only the necessary adapter is bundled:
@deepracticex/logger → Auto-detect → appropriate adapter
@deepracticex/logger/nodejs → nodejs.ts → pino-adapter
@deepracticex/logger/cloudflare-workers → cloudflare-workers.ts → console-adapter
@deepracticex/logger/browser → browser.ts → console-adapter
@deepracticex/logger/test → test.ts → test-adapter
Auto-detection priority:
This allows bundlers (esbuild, webpack, etc.) to tree-shake unused code. If you use the Cloudflare Workers entry, the 200KB+ pino dependency won't be included in your bundle.
Yes! Create a logger module:
// src/infrastructure/logger/index.ts
import { createLogger } from "@deepracticex/logger/cloudflare-workers";
export const logger = createLogger({
name: "my-app",
level: "info",
});
Then import everywhere:
import { logger } from "~/infrastructure/logger";
logger.info("Hello from any file!");
Yes! Each package can use the appropriate entry point:
// apps/api (Node.js)
import { createLogger } from "@deepracticex/logger";
// apps/worker (Cloudflare)
import { createLogger } from "@deepracticex/logger/cloudflare-workers";
// apps/web (Browser)
import { createLogger } from "@deepracticex/logger/browser";
The logger automatically detects test environments (vitest/jest) and uses the test adapter:
// Automatically silent in tests
import { createLogger } from "@deepracticex/logger";
const logger = createLogger();
logger.info("message"); // Captured, but no console output
To inspect logs in tests:
import {
createLogger,
getTestLogs,
clearTestLogs,
} from "@deepracticex/logger/test";
const logger = createLogger();
logger.info("test message");
const logs = getTestLogs();
expect(logs[0].message).toBe("test message");
clearTestLogs(); // Clean up
Use vitest's verbose reporter:
pnpm test -- --reporter=verbose
Or enable console output explicitly:
const logger = createLogger({ console: true });
MIT
FAQs
Lazy-initialized logging with pluggable backends
The npm package @deepracticex/logger receives a total of 44 weekly downloads. As such, @deepracticex/logger popularity was classified as not popular.
We found that @deepracticex/logger demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 2 open source maintainers collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
The supply chain control that delays freshly published gems now covers lockfile generation and gem vendoring in Ruby projects.

Security News
During a UK cyber test, a Mythos 5 agent used sockpuppets, social engineering, and prompt injection to try to get a maintainer to merge malware.

Company News
Socket is now in the AWS Security Hub Extended plan. Adopt it through AWS, apply committed spend, and block malicious open source packages.