{"_id":"@asimsafar/next-log","_rev":"3-88c825cd7fd4a1b21e58255ec3a01c66","name":"@asimsafar/next-log","dist-tags":{"latest":"0.1.2"},"versions":{"0.1.0":{"name":"@asimsafar/next-log","version":"0.1.0","keywords":["nextjs","logging","logger","next.js","server-components","edge","typescript","middleware","request-id","async-local-storage"],"author":{"name":"Asim Safarli"},"license":"MIT","_id":"@asimsafar/next-log@0.1.0","maintainers":[{"name":"asimsafar","email":"saffarrli14@gmail.com"}],"homepage":"https://github.com/AsimSafarli/next-log#readme","bugs":{"url":"https://github.com/AsimSafarli/next-log/issues"},"dist":{"shasum":"fd07adab696d96d40af5addee798e0a68accfe32","tarball":"https://registry.npmjs.org/@asimsafar/next-log/-/next-log-0.1.0.tgz","fileCount":16,"integrity":"sha512-5xgMW0XTJ1FObJzD4pb872DEu1oM12f7IQ/1QTWF/ceRHDgHaeut2CdJbYeMJNopZ/qQ1IKBIr+be5TTyAXIOg==","signatures":[{"sig":"MEQCICgDb0CA/Svt4ku8X7/LVDfRjaN4gUWeg6LsMMPsegJNAiAb7cepTgwFWbvFlhOsocPCZzlIzuMIMLexiPabdS5r+Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":44551},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./api":{"types":"./dist/api/route-handler.d.ts","import":"./dist/api/route-handler.mjs","require":"./dist/api/route-handler.js"},"./middleware":{"types":"./dist/middleware/index.d.ts","import":"./dist/middleware/index.mjs","require":"./dist/middleware/index.js"}},"gitHead":"0c9042db6bf65ca628934fba90a6669f28786bc1","scripts":{"dev":"tsup --watch","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"asimsafar","email":"saffarrli14@gmail.com"},"repository":{"url":"git+https://github.com/AsimSafarli/next-log.git","type":"git"},"_npmVersion":"11.8.0","description":"Unified logging for Next.js — server, client, edge middleware. One API, every environment.","directories":{},"_nodeVersion":"24.2.0","_hasShrinkwrap":false,"devDependencies":{"next":"^14.0.0","tsup":"^8.0.0","typescript":"^5.0.0","@types/node":"^20.0.0"},"peerDependencies":{"next":">=14.0.0"},"_npmOperationalInternal":{"tmp":"tmp/next-log_0.1.0_1772540466243_0.5064732829432566","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@asimsafar/next-log","version":"0.1.1","keywords":["nextjs","logging","logger","next.js","server-components","edge","typescript","middleware","request-id","async-local-storage"],"author":{"name":"Asim Safarli"},"license":"MIT","_id":"@asimsafar/next-log@0.1.1","maintainers":[{"name":"asimsafar","email":"saffarrli14@gmail.com"}],"homepage":"https://github.com/AsimSafarli/next-log#readme","bugs":{"url":"https://github.com/AsimSafarli/next-log/issues"},"dist":{"shasum":"3f4693adfea9a5fda7d4d5bd8d3955b1091d8f90","tarball":"https://registry.npmjs.org/@asimsafar/next-log/-/next-log-0.1.1.tgz","fileCount":16,"integrity":"sha512-Jdi3fG4tstSWZziQjKalghldMHM0O73qeipuSsbkvH7KVGiWPsV5jhjBnVb/TyqoPbnFGdHI5GQmgNWZwVYmrw==","signatures":[{"sig":"MEYCIQDwsPuRjjg4qMscd/KFzJoLmKn3+Jd/DWDQ2SckuG4/FgIhAKMcZTzpALLQ04qU2cHpdQqVfKYGQ19XsD7t8QiHHbfQ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":44642},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./api":{"types":"./dist/api/route-handler.d.ts","import":"./dist/api/route-handler.mjs","require":"./dist/api/route-handler.js"},"./middleware":{"types":"./dist/middleware/index.d.ts","import":"./dist/middleware/index.mjs","require":"./dist/middleware/index.js"}},"gitHead":"0c9042db6bf65ca628934fba90a6669f28786bc1","scripts":{"dev":"tsup --watch","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"asimsafar","email":"saffarrli14@gmail.com"},"repository":{"url":"git+https://github.com/AsimSafarli/next-log.git","type":"git"},"_npmVersion":"11.8.0","description":"Unified logging for Next.js — server, client, edge middleware. One API, every environment.","directories":{},"_nodeVersion":"24.2.0","_hasShrinkwrap":false,"devDependencies":{"next":"^14.0.0","tsup":"^8.0.0","typescript":"^5.0.0","@types/node":"^20.0.0"},"peerDependencies":{"next":">=14.0.0"},"_npmOperationalInternal":{"tmp":"tmp/next-log_0.1.1_1772540622525_0.6166031610817222","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@asimsafar/next-log","version":"0.1.2","description":"Unified logging for Next.js — server, client, edge middleware. One API, every environment.","main":"dist/index.js","module":"dist/index.mjs","types":"dist/index.d.ts","exports":{".":{"import":"./dist/index.mjs","require":"./dist/index.js","types":"./dist/index.d.ts"},"./middleware":{"import":"./dist/middleware/index.mjs","require":"./dist/middleware/index.js","types":"./dist/middleware/index.d.ts"},"./api":{"import":"./dist/api/route-handler.mjs","require":"./dist/api/route-handler.js","types":"./dist/api/route-handler.d.ts"}},"scripts":{"build":"tsup","dev":"tsup --watch","typecheck":"tsc --noEmit"},"keywords":["nextjs","logging","logger","next.js","server-components","edge","typescript","middleware","request-id","async-local-storage"],"author":{"name":"Asim Safarli"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/AsimSafarli/next-log.git"},"homepage":"https://github.com/AsimSafarli/next-log#readme","bugs":{"url":"https://github.com/AsimSafarli/next-log/issues"},"peerDependencies":{"next":">=14.0.0"},"devDependencies":{"@types/node":"^20.0.0","next":"^14.0.0","tsup":"^8.0.0","typescript":"^5.0.0"},"browser":{"node:fs":false,"node:path":false,"fs":false,"path":false,"async_hooks":false},"gitHead":"766803cf9f416399b24c9f7d8613bac5d740007a","_id":"@asimsafar/next-log@0.1.2","_nodeVersion":"24.2.0","_npmVersion":"11.8.0","dist":{"integrity":"sha512-zKWYMQghweUeL02kCnCBm6sp9jR78+FOQKhI1jVmqKypG4BwN2KasFEq44lGOGqhS3UH3WqLRWE+Zy2exEYk9g==","shasum":"fdf84c38268b351e480a36f304423f969ab8a3a1","tarball":"https://registry.npmjs.org/@asimsafar/next-log/-/next-log-0.1.2.tgz","fileCount":16,"unpackedSize":44578,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDq8niqHBvdwFEjuVDE7tR0HCUhoSLLoSD9YazgDVr6dAIgY0cqhy+saX6CWk8wSvU6M92HI/W02/lKcsGCzJ7VmX8="}]},"_npmUser":{"name":"asimsafar","email":"saffarrli14@gmail.com"},"directories":{},"maintainers":[{"name":"asimsafar","email":"saffarrli14@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/next-log_0.1.2_1772541365340_0.6273342259176471"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-03T12:21:05.853Z","modified":"2026-03-03T12:36:05.614Z","0.1.0":"2026-03-03T12:21:06.431Z","0.1.1":"2026-03-03T12:23:42.665Z","0.1.2":"2026-03-03T12:36:05.467Z"},"bugs":{"url":"https://github.com/AsimSafarli/next-log/issues"},"author":{"name":"Asim Safarli"},"license":"MIT","homepage":"https://github.com/AsimSafarli/next-log#readme","keywords":["nextjs","logging","logger","next.js","server-components","edge","typescript","middleware","request-id","async-local-storage"],"repository":{"type":"git","url":"git+https://github.com/AsimSafarli/next-log.git"},"description":"Unified logging for Next.js — server, client, edge middleware. One API, every environment.","maintainers":[{"name":"asimsafar","email":"saffarrli14@gmail.com"}],"readme":"# @asimsafar/next-log\n\nUnified logging for Next.js. One API across Server Components, Client Components, and Edge Middleware — with automatic `requestId` propagation.\n\n```bash\nnpm install @asimsafar/next-log\n```\n\n---\n\n## The Problem\n\nNext.js has no built-in logging solution:\n\n| Environment | Problem |\n|---|---|\n| Server Component | `console.log` works but has no request context |\n| Client Component | Logs stay in the browser — never reach your server |\n| Edge Middleware | Context is lost before it reaches Server Components |\n\n`@asimsafar/next-log` solves all three with a single API.\n\n---\n\n## How It Works\n\n```\nMiddleware starts\n  → generates requestId + traceId via AsyncLocalStorage\n  → context flows automatically into Server Components\n\nClient logs\n  → batched and sent to /api/next-log\n  → written to server stdout with full context\n```\n\nOutput (dev):\n```\n10:22:11 INF srv f3a2bc10 [db] query executed {\"ms\":42}\n```\n\nOutput (prod):\n```json\n{\"timestamp\":\"...\",\"level\":\"info\",\"msg\":\"query executed\",\"requestId\":\"f3a2bc10\",\"module\":\"db\",\"ms\":42}\n```\n\n---\n\n## Setup\n\n### 1. Create your logger\n\n```ts\n// lib/logger.ts\nimport { createLogger } from '@asimsafar/next-log'\n\nexport const log = createLogger({\n  level: 'info', // 'debug' | 'info' | 'warn' | 'error'\n})\n```\n\n### 2. Add the middleware\n\n```ts\n// middleware.ts\nimport { withLogging } from '@asimsafar/next-log/middleware'\nimport { NextResponse } from 'next/server'\n\nexport default withLogging(async (req) => {\n  return NextResponse.next()\n})\n\nexport const config = {\n  matcher: ['/((?!_next/static|_next/image|favicon.ico).*)'],\n}\n```\n\n### 3. Add the API route (receives client logs)\n\n```ts\n// app/api/next-log/route.ts\nexport { logHandler as POST } from '@asimsafar/next-log/api'\n```\n\n---\n\n## Usage\n\n```ts\nimport { log } from '@/lib/logger'\n\nlog.debug('cache miss', { key: 'user:42' })\nlog.info('order created', { orderId: 'ORD-881', userId: 'usr-44' })\nlog.warn('rate limit approaching', { remaining: 10 })\nlog.error('payment failed', { error: err.message })\n\n// Child logger — scoped context added to every log\nconst dbLog = log.child({ module: 'database' })\ndbLog.info('query executed', { ms: 42 })\n// → { level: \"info\", msg: \"query executed\", module: \"database\", requestId: \"...\", ms: 42 }\n```\n\n---\n\n## Output\n\n**Development** (pretty format):\n```\n10:22:11 INF srv f3a2bc10 order created {\"orderId\":\"ORD-881\"}\n10:22:11 INF cli f3a2bc10 [database] query executed {\"ms\":42}\n10:22:11 ERR srv f3a2bc10 payment failed {\"error\":\"Insufficient funds\"}\n```\n\n**Production** (JSON format):\n```json\n{\"timestamp\":\"2026-03-03T10:22:11.432Z\",\"level\":\"info\",\"msg\":\"order created\",\"env\":\"server\",\"requestId\":\"f3a2bc10\",\"traceId\":\"span-447\",\"orderId\":\"ORD-881\"}\n```\n\n---\n\n## Configuration\n\n```ts\ncreateLogger({\n  // Minimum log level (default: 'info')\n  level: 'debug',\n\n  // Output format (default: auto — 'pretty' in dev, 'json' in prod)\n  format: 'json',\n\n  // Default fields added to every log entry\n  defaultMeta: {\n    app: 'my-app',\n    version: '1.0.0',\n  },\n\n  // Override transports per environment\n  transports: {\n    server: ['console', 'file'], // stdout + logs/app.log\n    client: ['http'],            // POST to /api/next-log\n    edge:   ['console'],         // stdout\n  },\n\n  // Custom endpoint for client logs (default: '/api/next-log')\n  logEndpoint: '/api/logs',\n})\n```\n\n---\n\n## Transports\n\n| Transport | Environments | Description |\n|---|---|---|\n| `console` | server, edge | Writes to stdout/stderr |\n| `http` | client | Batches logs and POSTs to `/api/next-log` |\n| `file` | server | Appends to `logs/app.log` |\n\n---\n\n## Advanced\n\n### Custom transport\n\n```ts\nimport { createLogger, type Transport, type LogEntry } from '@asimsafar/next-log'\n\nconst datadogTransport: Transport = {\n  write(entry: LogEntry) {\n    fetch('https://http-intake.logs.datadoghq.com/api/v2/logs', {\n      method: 'POST',\n      headers: { 'DD-API-KEY': process.env.DD_API_KEY! },\n      body: JSON.stringify(entry),\n    })\n  }\n}\n\nexport const log = createLogger()\nlog.addTransport(datadogTransport)\n```\n\n### Manual context\n\n```ts\nimport { setContext } from '@asimsafar/next-log'\n\n// Add fields to the current async context\nsetContext({ userId: session.user.id, plan: 'pro' })\n\n// All subsequent logs in this request will include these fields\nlog.info('dashboard loaded')\n// → { ..., userId: \"usr-44\", plan: \"pro\" }\n```\n\n### Middleware options\n\n```ts\nexport default withLogging(handler, {\n  requestIdHeader: 'x-request-id',\n  traceIdHeader:   'x-trace-id',\n  defaultFields:   { region: 'eu-west-1' },\n})\n```\n\n---\n\n## Log Entry Shape\n\n```ts\n{\n  timestamp:  string                               // ISO 8601\n  level:      'debug' | 'info' | 'warn' | 'error'\n  msg:        string\n  env:        'server' | 'client' | 'edge'\n  requestId?: string                               // set by withLogging()\n  traceId?:   string                               // set by withLogging()\n  // ...any additional fields you pass\n}\n```\n\n---\n\n## License\n\nMIT","readmeFilename":"README.md"}