{"_id":"@abhinav-dev/ctx-logger","_rev":"2-8135d59a46dfe2ee0af6e06e0dd00223","name":"@abhinav-dev/ctx-logger","dist-tags":{"latest":"0.2.0"},"versions":{"0.1.0":{"name":"@abhinav-dev/ctx-logger","version":"0.1.0","license":"MIT","_id":"@abhinav-dev/ctx-logger@0.1.0","maintainers":[{"name":"abhinav-dev","email":"abhinav.work3017@gmail.com"}],"dist":{"shasum":"563708768623bfe13adfb80425ff67ac9444a96a","tarball":"https://registry.npmjs.org/@abhinav-dev/ctx-logger/-/ctx-logger-0.1.0.tgz","fileCount":31,"integrity":"sha512-b103HULOngoMmy0KoPDiJ6aojO2Gu7o+h/FssAa34J2JxHDGk6qhp7HEXo4F58Ffi3JrzaygkIge77S3EYi6MQ==","signatures":[{"sig":"MEYCIQC/ZDb5W0Bw+1WB5gmVI7/lLhM+2lOkh+h7Ml7+Uu7dQwIhAIm2ODwU6Zgk7FUsDaJkFkkfoE+NURUol0HdaSJrXwNv","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":24869},"main":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","require":"./dist/index.js"}},"scripts":{"build":"tsc -p tsconfig.json","clean":"rimraf dist","prepublishOnly":"npm run clean && npm run build"},"_npmUser":{"name":"abhinav-dev","email":"abhinav.work3017@gmail.com"},"_npmVersion":"11.6.2","description":"Explicit, vendor-neutral structured logger for Node.js/TypeScript (pino engine).","directories":{},"_nodeVersion":"24.13.0","dependencies":{"pino":"^9.0.0"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^6.0.0","typescript":"^5.9.3","@types/node":"^25.0.9"},"_npmOperationalInternal":{"tmp":"tmp/ctx-logger_0.1.0_1768556809453_0.3486961319317117","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@abhinav-dev/ctx-logger","description":"Explicit, vendor-neutral structured logger for Node.js/TypeScript (pino engine).","license":"MIT","version":"0.2.0","private":false,"main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc -p tsconfig.json","clean":"rimraf dist","prepublishOnly":"npm run clean && npm run build"},"dependencies":{"pino":"^9.0.0"},"devDependencies":{"@types/node":"^25.0.9","rimraf":"^6.0.0","typescript":"^5.9.3"},"exports":{".":{"require":"./dist/index.js","types":"./dist/index.d.ts"}},"gitHead":"b8869105e8ae6b0a7fd6ad351f5433a078f94972","_id":"@abhinav-dev/ctx-logger@0.2.0","_nodeVersion":"24.13.0","_npmVersion":"11.6.2","dist":{"integrity":"sha512-GE6u8fBdehlatnckhU+nfZzVMX8dkwtsc1owOUfdYF9ILe8PVZa0uc/cXcfz4jhbS0VPMcSI2mnXDFGLgsF+Zw==","shasum":"d675da620a13d12af60ef4ec151003a677a4defd","tarball":"https://registry.npmjs.org/@abhinav-dev/ctx-logger/-/ctx-logger-0.2.0.tgz","fileCount":71,"unpackedSize":88633,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIDJ8GT9c1vd4secgQlUOuwHDzCupvLjEsIvVuGUvwIydAiEArbtveU5MJFTZRVnJAoDxoXrF+OGQlUIxS9ocXDXoPBk="}]},"_npmUser":{"name":"abhinav-dev","email":"abhinav.work3017@gmail.com"},"directories":{},"maintainers":[{"name":"abhinav-dev","email":"abhinav.work3017@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/ctx-logger_0.2.0_1768829087363_0.20599870437111534"},"_hasShrinkwrap":false}},"time":{"created":"2026-01-16T09:46:49.338Z","modified":"2026-01-19T13:24:47.635Z","0.1.0":"2026-01-16T09:46:49.657Z","0.2.0":"2026-01-19T13:24:47.504Z"},"license":"MIT","description":"Explicit, vendor-neutral structured logger for Node.js/TypeScript (pino engine).","maintainers":[{"name":"abhinav-dev","email":"abhinav.work3017@gmail.com"}],"readme":"# Structured Logger (Node.js / TypeScript)\r\n\r\nA **simple, explicit, and vendor-neutral logging wrapper** for Node.js services.\r\n\r\nDesigned to survive:\r\n\r\n- CloudWatch → Splunk → Datadog migrations\r\n- different execution models (API, cron, queue, batch, CLI)\r\n- long-lived enterprise codebases\r\n\r\nNo magic. No hidden context. No runtime dependencies on async hooks.\r\n\r\n---\r\n\r\n## Why this library exists\r\n\r\nIn many services:\r\n\r\n- logging libraries get swapped over time (pino → something else)\r\n- log destinations change (CloudWatch → Splunk → Datadog)\r\n- log formats drift and dashboards break\r\n\r\nThis library solves that by enforcing:\r\n\r\n- a **stable log schema**\r\n- **explicit context passing**\r\n- **structured JSON logs**\r\n- **engine abstraction** (pino today, others later)\r\n\r\n---\r\n\r\n## Core principles\r\n\r\n- JSON logs only\r\n- Explicit context (no AsyncLocalStorage)\r\n- Stable, machine-friendly event names\r\n- Human-friendly messages\r\n- Redaction by default\r\n- Compatible with CommonJS and older Node runtimes\r\n\r\n---\r\n\r\n## Installation\r\n\r\n```bash\r\nnpm install @abhinav-dev/ctx-logger\r\n```\r\n\r\n## Quick Start\r\n\r\n1. Create the logger (once)\r\n\r\n```bash\r\nimport { createLogger } from \"@abhinav-dev/ctx-logger\";\r\n\r\nconst logger = createLogger();\r\n```\r\n\r\n2. Create a context (per request / job / trigger)\r\n\r\n```bash\r\nconst ctx: LoggerContext = {\r\n  service: \"orders-api\",\r\n  env: \"prod\",\r\n  version: \"1.2.3\",\r\n  correlation_id: \"c-9f3e8d2\",\r\n};\r\n```\r\n\r\n3. Log events\r\n\r\n```bash\r\nlogger.info(ctx, \"service_started\");\r\n\r\nlogger.info(ctx, \"order_created\", {\r\n  order_id: \"o-123\",\r\n  amount: 499,\r\n});\r\n\r\nlogger.error(ctx, \"db_query_failed\", {\r\n  table: \"orders\",\r\n  reason: \"timeout\",\r\n});\r\n\r\n```\r\n\r\n## Derived context (optional)\r\n\r\nTo add stable sub-scope fields without mutating the original context:\r\n\r\n```bash\r\nconst orderCtx = logger.with(ctx, { order_id: \"o-123\" });\r\n\r\nlogger.info(orderCtx, \"order_loaded\");\r\n\r\n```\r\n\r\n## Log Output\r\n\r\nExample:\r\n\r\n```bash\r\n{\r\n  \"level\": 30,\r\n  \"time\": \"2026-01-16T06:38:58.483Z\",\r\n\r\n  \"service\": \"demo\",\r\n  \"env\": \"dev\",\r\n  \"version\": \"0.1.0\",\r\n  \"correlation_id\": \"c-1\",\r\n\r\n  \"level_name\": \"info\",\r\n  \"event\": \"hello\",\r\n  \"message\": \"hello\",\r\n\r\n  \"details\": {\r\n    \"name\": \"a\",\r\n    \"password\": \"[REDACTED]\"\r\n  }\r\n}\r\n\r\n\r\n```\r\n\r\n## Redaction\r\n\r\nSensitive keys are redacted automatically inside details.\r\n\r\nDefault redacted keys (case-insensitive):\r\n\r\n- authorization\r\n- cookie, set-cookie\r\n- password\r\n- token\r\n- secret\r\n- api_key\r\n- client_secret\r\n\r\nExample:\r\n\r\n```bash\r\nlogger.info(ctx, \"login_attempt\", {\r\n  username: \"myusername\",\r\n  password: \"secret123\",\r\n});\r\n\r\nOutput:\r\n\r\n\"details\": {\r\n  \"username\": \"myusername\",\r\n  \"password\": \"[REDACTED]\"\r\n}\r\n\r\n```\r\n","readmeFilename":"Readme.md"}