{"_id":"@20syldev/logger.ts","_rev":"3-243ea41480a678feecb2bdf5c5024dcf","name":"@20syldev/logger.ts","dist-tags":{"latest":"1.0.2"},"versions":{"1.0.0":{"name":"@20syldev/logger.ts","version":"1.0.0","keywords":["logger","logs","http","json","server","monitor"],"author":{"name":"Sylvain L."},"license":"BSD 3-Clause","_id":"@20syldev/logger.ts@1.0.0","maintainers":[{"name":"20syldev","email":"git@sylvain.pro"}],"homepage":"https://github.com/20syldev/logger.ts","bugs":{"url":"https://github.com/20syldev/logger.ts/issues"},"dist":{"shasum":"bba0b503d6bf23bd438371daa550a748d027f551","tarball":"https://registry.npmjs.org/@20syldev/logger.ts/-/logger.ts-1.0.0.tgz","fileCount":21,"integrity":"sha512-GHuTVmzf1dWbE7J5w8pC+ygzq1+xpzenrufww3U6f+NtvJSNeelzuKA9rMV+ryaU2WkUiNT6yTjSsp2KTsTp0A==","signatures":[{"sig":"MEUCIFIFEm3D1dX9GYlUqFPrNcNVyxKgABV9RJOPe6weX5KFAiEAxn7dnmxaBr//Tee88C30p1uCMyy4Xcyu+ZDMRCxHbuE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":24954},"main":"dist/logger.js","type":"module","types":"dist/logger.d.ts","gitHead":"49d41d90ff5c352d5918bc6842fc9249e11ea08a","scripts":{"test":"node --import tsx tests/test.ts","build":"tsc","format":"prettier --write src/ tests/ && eslint src/ tests/","test:serve":"node --import tsx tests/serve.ts"},"_npmUser":{"name":"20syldev","email":"git@sylvain.pro"},"repository":{"url":"git+https://github.com/20syldev/logger.ts.git","type":"git"},"_npmVersion":"10.9.4","description":"Server-side structured log generation for flowers.","directories":{},"_nodeVersion":"22.22.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","eslint":"^10.1.0","prettier":"^3.8.1","@eslint/js":"^10.0.1","typescript":"^5.7.0","@types/node":"^25.5.0","typescript-eslint":"^8.57.1","eslint-config-prettier":"^10.1.8"},"_npmOperationalInternal":{"tmp":"tmp/logger.ts_1.0.0_1774215140379_0.4656226979180078","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@20syldev/logger.ts","version":"1.0.1","keywords":["logger","logs","http","json","server","monitor"],"author":{"name":"Sylvain L."},"license":"BSD 3-Clause","_id":"@20syldev/logger.ts@1.0.1","maintainers":[{"name":"20syldev","email":"git@sylvain.pro"}],"homepage":"https://github.com/20syldev/logger.ts","bugs":{"url":"https://github.com/20syldev/logger.ts/issues"},"dist":{"shasum":"c2cd9a9fda0b9aed7cba7d0278b0650ef7446e5d","tarball":"https://registry.npmjs.org/@20syldev/logger.ts/-/logger.ts-1.0.1.tgz","fileCount":21,"integrity":"sha512-lbiZg5F2O8f+va16hufOc+gjBxPgQZ+a33qOGakG57LHbTx+R6+dtf8plqscqEQk2ycKczHewNWFWZJIyy+RVA==","signatures":[{"sig":"MEUCIDJDWhyH59RGYKrovnjF3JvBD8wZn4dM9j+Qzhv9NgtjAiEA44sLcJzsK7b5uNdUlreZCoHwfPjOtK5mka+tEknQboA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":31325},"main":"dist/logger.js","type":"module","types":"dist/logger.d.ts","gitHead":"49d41d90ff5c352d5918bc6842fc9249e11ea08a","scripts":{"test":"node --import tsx tests/test.ts","build":"tsc","format":"prettier --write src/ tests/ && eslint src/ tests/","test:serve":"node --import tsx tests/serve.ts"},"_npmUser":{"name":"20syldev","email":"git@sylvain.pro"},"repository":{"url":"git+https://github.com/20syldev/logger.ts.git","type":"git"},"_npmVersion":"10.9.4","description":"A minimalist Node.js module to generate, format, and serve structured logs as JSON.","directories":{},"_nodeVersion":"22.22.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","eslint":"^10.1.0","prettier":"^3.8.1","@eslint/js":"^10.0.1","typescript":"^5.7.0","@types/node":"^25.5.0","typescript-eslint":"^8.57.1","eslint-config-prettier":"^10.1.8"},"_npmOperationalInternal":{"tmp":"tmp/logger.ts_1.0.1_1774278403580_0.4800251892332206","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"_id":"@20syldev/logger.ts@1.0.2","bugs":{"url":"https://github.com/20syldev/logger.ts/issues"},"dist":{"shasum":"b1bfb4b5f3a5f94115eed4bca76dfdfc3bdc6412","tarball":"https://registry.npmjs.org/@20syldev/logger.ts/-/logger.ts-1.0.2.tgz","integrity":"sha512-1QZu2k/H6P7k1ImV3noPUrg+ZEaWQloiSy5G+9KsOHvzkStOdR21uIhxC2H9ujmk8KVs9Hvf0k5/inWsspgdgQ==","fileCount":23,"unpackedSize":38420,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@20syldev%2flogger.ts@1.0.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQC31Q/te4K4ja9vgPM2M7Vjd97rJWB4XGfE2bTtPi28lAIhALmEMlRkPju7B9QbWinBdJPUqn0gKoJVCpa/AAbgS5cx"}]},"main":"dist/logger.js","name":"@20syldev/logger.ts","type":"module","types":"dist/logger.d.ts","author":{"name":"Sylvain L."},"gitHead":"54b30da95f2df0028cbc06379bbdeb5c4a7153db","license":"BSD 3-Clause","scripts":{"test":"node --import tsx tests/test.ts","build":"tsc","check":"tsc --noEmit && eslint src/ tests/ && prettier --check src/ tests/ README.md","format":"prettier --write src/ tests/ README.md && eslint src/ tests/","prepare":"tsc","test:serve":"node --import tsx tests/serve.ts"},"version":"1.0.2","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a64e6c12-7d66-4e71-8ed6-a203dc29b722"},"approver":{"name":"20syldev","email":"git@sylvain.sh"}},"homepage":"https://github.com/20syldev/logger.ts","keywords":["logger","logs","http","json","server","monitor"],"repository":{"url":"git+https://github.com/20syldev/logger.ts.git","type":"git"},"_npmVersion":"11.19.1","description":"A minimalist Node.js module to generate, format, and serve structured logs as JSON.","directories":{},"maintainers":[{"name":"20syldev","email":"git@sylvain.sh"}],"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"devDependencies":{"tsx":"^4.19.0","eslint":"^10.1.0","prettier":"3.8.1","@eslint/js":"^10.0.1","typescript":"^5.7.0","@types/node":"^25.5.0","typescript-eslint":"^8.57.1","eslint-config-prettier":"^10.1.8"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/logger.ts_1.0.2_1788860146294_0.6319842555405277"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-22T21:32:20.312Z","modified":"2026-09-08T09:35:46.825Z","1.0.0":"2026-03-22T21:32:20.528Z","1.0.1":"2026-03-23T15:06:43.712Z","1.0.2":"2026-09-08T09:35:46.392Z"},"bugs":{"url":"https://github.com/20syldev/logger.ts/issues"},"author":{"name":"Sylvain L."},"license":"BSD 3-Clause","homepage":"https://github.com/20syldev/logger.ts","keywords":["logger","logs","http","json","server","monitor"],"repository":{"url":"git+https://github.com/20syldev/logger.ts.git","type":"git"},"description":"A minimalist Node.js module to generate, format, and serve structured logs as JSON.","maintainers":[{"name":"20syldev","email":"git@sylvain.sh"}],"readme":"# @20syldev/logger.ts\n\nA minimalist **Node.js** module to generate, format, and serve structured logs as JSON.\n\n## Installation\n\n```console\nnpm install @20syldev/logger.ts\n```\n\n## Usage\n\n### Import\n\n```js\nimport { createLogger } from \"@20syldev/logger.ts\";\n```\n\n### Create a logger\n\n```js\nconst logger = createLogger({\n    maxEntries: 500,\n    order: \"desc\",\n    theme: \"detailed\",\n});\n```\n\n### Log entries\n\n```js\nlogger.log({\n    method: \"GET\",\n    url: \"/api/users\",\n    status: 200,\n    duration: \"45ms\",\n});\n```\n\n### Log levels\n\nEach entry carries a level: `debug`, `info`, `warn` or `error`. Use the dedicated\nmethods, or set `level` on the entry yourself.\n\n```js\nlogger.debug({ method: \"GET\", url: \"/debug/query\", status: 200 });\nlogger.info({ method: \"GET\", url: \"/api/users\", status: 200 });\nlogger.warn({ method: \"POST\", url: \"/api/upload\", status: 413 });\nlogger.error({ method: \"DELETE\", url: \"/api/data\", status: 500 });\n```\n\nSet a minimum level to drop anything less severe. Entries logged through `.log()`\nwithout an explicit `level` count as `info`.\n\n```js\nconst logger = createLogger({ level: \"warn\" });\n\nlogger.info({ url: \"/noisy\" }); // → null, not stored\nlogger.error({ url: \"/boom\" }); // → stored\n```\n\nThe `detailed` theme prints the level; any custom theme can use the `{level}`\nplaceholder, coloured through `levelDebug`, `levelInfo`, `levelWarn` and `levelError`.\n\n### Log from Node.js request/response\n\n```js\nimport http from \"node:http\";\n\nconst logger = createLogger();\n\nhttp.createServer((req, res) => {\n    const start = Date.now();\n    res.end(\"OK\");\n    logger.request(req, res, { duration: `${Date.now() - start}ms` });\n}).listen(8080);\n```\n\n### Serve logs as JSON API\n\n```js\nlogger.serve(3000);\n// → http://127.0.0.1:3000 returns JSON array of logs\n```\n\nQuery parameters for ordering and filtering:\n\n```\nGET /?order=desc&sort=timestamp\nGET /?limit=50&status=200&method=GET\nGET /?_group=auth\nGET /?level=warn\n```\n\n`level` is a minimum, not an exact match: `?level=warn` returns `warn` and `error`\nentries.\n\n### Health check\n\n```\nGET /health → { \"ok\": true, \"count\": 42 }\n```\n\n### Groups\n\n```js\nconst auth = logger.group(\"auth\");\nauth.log({ method: \"POST\", url: \"/login\", status: 200 });\n// Console: [auth] 12:34:56 ✓ POST /login → 200\n// Entry includes _group: \"auth\"\n```\n\n### Events\n\n```js\nlogger.on(\"log\", (entry) => {\n    if (entry.status >= 500) sendAlert(entry);\n});\n\nlogger.on(\"clear\", () => console.log(\"Logs cleared\"));\n```\n\n### Console themes\n\nBuilt-in themes: `minimal`, `colored` (default), `detailed`, `plain`.\n\n```js\n// Use a preset\nconst logger = createLogger({ theme: \"detailed\" });\n\n// Custom theme\nconst logger = createLogger({\n    theme: {\n        format: \"{time} {icon} {method} {url} → {status} ({duration})\",\n        colors: {\n            timestamp: \"\\x1b[90m\",\n            method: \"\\x1b[36m\",\n            status2xx: \"\\x1b[32m\",\n            status5xx: \"\\x1b[31m\",\n        },\n        icons: {\n            success: \"✓\",\n            serverError: \"✗\",\n        },\n    },\n});\n\n// Disable console output\nconst logger = createLogger({ console: false });\n\n// Manual print\nlogger.print(entry);\n```\n\n## Details\n\n### `createLogger(options)`\n\nCreates a logger instance with the following options:\n\n| Option       | Default       | Description                                                                                                   |\n| ------------ | ------------- | ------------------------------------------------------------------------------------------------------------- |\n| `maxEntries` | `1000`        | Maximum logs in memory (FIFO eviction)                                                                        |\n| `cors`       | `\"*\"`         | CORS origin header for `serve()`                                                                              |\n| `order`      | `\"asc\"`       | Default sort order (`\"asc\"` or `\"desc\"`)                                                                      |\n| `sort`       | `\"timestamp\"` | Default sort field                                                                                            |\n| `console`    | `true`        | Auto-print to console on each `.log()`                                                                        |\n| `theme`      | `\"colored\"`   | Theme preset name, custom theme object, or `false` to disable                                                 |\n| `maxAge`     | `null`        | TTL in seconds (auto-removes old entries)                                                                     |\n| `level`      | `\"debug\"`     | Minimum level to store (`\"debug\"`, `\"info\"`, `\"warn\"`, `\"error\"`)                                             |\n| `timeFormat` | `\"time\"`      | Timestamp format: `\"time\"`, `\"iso\"`, `\"locale\"`, `\"date\"`, `\"datetime\"`, `\"utc\"`, or `(date: Date) => string` |\n\n### Methods\n\n| Method                                                              | Description                                                                             |\n| ------------------------------------------------------------------- | --------------------------------------------------------------------------------------- |\n| `.log(entry)`                                                       | Adds a structured entry. Auto-adds `timestamp` if missing. Returns the entry or `null`. |\n| `.debug(entry)` / `.info(entry)` / `.warn(entry)` / `.error(entry)` | Same as `.log()`, tagged with the matching level.                                       |\n| `.request(req, res, extras)`                                        | Logs from Node.js HTTP objects. Returns the entry or `null`.                            |\n| `.print(entry)`                                                     | Manually prints an entry to console.                                                    |\n| `.entries()`                                                        | Returns all stored logs (sorted, TTL-filtered).                                         |\n| `.clear()`                                                          | Removes all stored logs.                                                                |\n| `.serve(port)`                                                      | Starts an HTTP server serving logs as JSON.                                             |\n| `.group(name)`                                                      | Creates a sub-logger with a namespace.                                                  |\n| `.on(event, cb)`                                                    | Listens to events (`\"log\"`, `\"clear\"`).                                                 |\n| `.off(event, cb)`                                                   | Removes an event listener.                                                              |\n\n### Public exports\n\nBeyond `createLogger`, the module exposes utilities and types for advanced usage:\n\n```js\nimport {\n    createLogger,\n    // Theme utilities\n    themes, // Record of built-in theme presets\n    resolveTheme, // Resolve a theme name or config into a Theme object\n    defaultColors, // Default ANSI color palette\n    defaultIcons, // Default status icons\n    getLevelColor, // Resolve the ANSI color for a log level\n    // Levels\n    LOG_LEVELS, // Tuple of level names, least to most severe\n    LEVEL_PRIORITY, // Record mapping each level to its numeric priority\n    // Event bus\n    createEventBus, // Standalone event emitter (used internally)\n} from \"@20syldev/logger.ts\";\n```\n\n**TypeScript types:**\n\n```ts\nimport type {\n    LogEntry,\n    LogLevel,\n    Logger,\n    SubLogger,\n    LoggerOptions,\n    Theme,\n    CustomTheme,\n    ThemeColors,\n    ThemeIcons,\n    TimeFormat,\n    LoggerEvent,\n    EventCallback,\n    EventBus,\n    ServeContext,\n} from \"@20syldev/logger.ts\";\n```\n","readmeFilename":"README.md"}