lograil 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +38 -0
- package/LICENSE +21 -0
- package/README.md +40 -0
- package/dist/cjs/context/async-context.browser.d.ts +16 -0
- package/dist/cjs/context/async-context.browser.d.ts.map +1 -0
- package/dist/cjs/context/async-context.browser.js +29 -0
- package/dist/cjs/context/async-context.browser.js.map +1 -0
- package/dist/cjs/context/async-context.d.ts +10 -0
- package/dist/cjs/context/async-context.d.ts.map +1 -0
- package/dist/cjs/context/async-context.js +37 -0
- package/dist/cjs/context/async-context.js.map +1 -0
- package/dist/cjs/context/context.d.ts +33 -0
- package/dist/cjs/context/context.d.ts.map +1 -0
- package/dist/cjs/context/context.js +57 -0
- package/dist/cjs/context/context.js.map +1 -0
- package/dist/cjs/context/index.d.ts +3 -0
- package/dist/cjs/context/index.d.ts.map +1 -0
- package/dist/cjs/context/index.js +19 -0
- package/dist/cjs/context/index.js.map +1 -0
- package/dist/cjs/core/entry.d.ts +30 -0
- package/dist/cjs/core/entry.d.ts.map +1 -0
- package/dist/cjs/core/entry.js +37 -0
- package/dist/cjs/core/entry.js.map +1 -0
- package/dist/cjs/core/index.d.ts +7 -0
- package/dist/cjs/core/index.d.ts.map +1 -0
- package/dist/cjs/core/index.js +24 -0
- package/dist/cjs/core/index.js.map +1 -0
- package/dist/cjs/core/level.d.ts +12 -0
- package/dist/cjs/core/level.d.ts.map +1 -0
- package/dist/cjs/core/level.js +31 -0
- package/dist/cjs/core/level.js.map +1 -0
- package/dist/cjs/core/logger.d.ts +271 -0
- package/dist/cjs/core/logger.d.ts.map +1 -0
- package/dist/cjs/core/logger.js +751 -0
- package/dist/cjs/core/logger.js.map +1 -0
- package/dist/cjs/core/printf.d.ts +34 -0
- package/dist/cjs/core/printf.d.ts.map +1 -0
- package/dist/cjs/core/printf.js +133 -0
- package/dist/cjs/core/printf.js.map +1 -0
- package/dist/cjs/index.d.ts +40 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +56 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/pipeline/filter.d.ts +10 -0
- package/dist/cjs/pipeline/filter.d.ts.map +1 -0
- package/dist/cjs/pipeline/filter.js +16 -0
- package/dist/cjs/pipeline/filter.js.map +1 -0
- package/dist/cjs/pipeline/formatter.d.ts +19 -0
- package/dist/cjs/pipeline/formatter.d.ts.map +1 -0
- package/dist/cjs/pipeline/formatter.js +183 -0
- package/dist/cjs/pipeline/formatter.js.map +1 -0
- package/dist/cjs/pipeline/index.d.ts +6 -0
- package/dist/cjs/pipeline/index.d.ts.map +1 -0
- package/dist/cjs/pipeline/index.js +22 -0
- package/dist/cjs/pipeline/index.js.map +1 -0
- package/dist/cjs/pipeline/pipeline.d.ts +45 -0
- package/dist/cjs/pipeline/pipeline.d.ts.map +1 -0
- package/dist/cjs/pipeline/pipeline.js +80 -0
- package/dist/cjs/pipeline/pipeline.js.map +1 -0
- package/dist/cjs/pipeline/processor.d.ts +67 -0
- package/dist/cjs/pipeline/processor.d.ts.map +1 -0
- package/dist/cjs/pipeline/processor.js +284 -0
- package/dist/cjs/pipeline/processor.js.map +1 -0
- package/dist/cjs/pipeline/sampler.d.ts +45 -0
- package/dist/cjs/pipeline/sampler.d.ts.map +1 -0
- package/dist/cjs/pipeline/sampler.js +62 -0
- package/dist/cjs/pipeline/sampler.js.map +1 -0
- package/dist/cjs/plugin/index.d.ts +4 -0
- package/dist/cjs/plugin/index.d.ts.map +1 -0
- package/dist/cjs/plugin/index.js +20 -0
- package/dist/cjs/plugin/index.js.map +1 -0
- package/dist/cjs/plugin/manager.d.ts +38 -0
- package/dist/cjs/plugin/manager.d.ts.map +1 -0
- package/dist/cjs/plugin/manager.js +79 -0
- package/dist/cjs/plugin/manager.js.map +1 -0
- package/dist/cjs/plugin/otel-trace.d.ts +19 -0
- package/dist/cjs/plugin/otel-trace.d.ts.map +1 -0
- package/dist/cjs/plugin/otel-trace.js +91 -0
- package/dist/cjs/plugin/otel-trace.js.map +1 -0
- package/dist/cjs/plugin/plugin.d.ts +41 -0
- package/dist/cjs/plugin/plugin.d.ts.map +1 -0
- package/dist/cjs/plugin/plugin.js +3 -0
- package/dist/cjs/plugin/plugin.js.map +1 -0
- package/dist/cjs/runtime/adapter.d.ts +81 -0
- package/dist/cjs/runtime/adapter.d.ts.map +1 -0
- package/dist/cjs/runtime/adapter.js +3 -0
- package/dist/cjs/runtime/adapter.js.map +1 -0
- package/dist/cjs/runtime/defaults.d.ts +27 -0
- package/dist/cjs/runtime/defaults.d.ts.map +1 -0
- package/dist/cjs/runtime/defaults.js +30 -0
- package/dist/cjs/runtime/defaults.js.map +1 -0
- package/dist/cjs/runtime/electron-binding.browser.d.ts +10 -0
- package/dist/cjs/runtime/electron-binding.browser.d.ts.map +1 -0
- package/dist/cjs/runtime/electron-binding.browser.js +18 -0
- package/dist/cjs/runtime/electron-binding.browser.js.map +1 -0
- package/dist/cjs/runtime/electron-binding.d.ts +24 -0
- package/dist/cjs/runtime/electron-binding.d.ts.map +1 -0
- package/dist/cjs/runtime/electron-binding.js +49 -0
- package/dist/cjs/runtime/electron-binding.js.map +1 -0
- package/dist/cjs/runtime/electron-lifecycle.d.ts +17 -0
- package/dist/cjs/runtime/electron-lifecycle.d.ts.map +1 -0
- package/dist/cjs/runtime/electron-lifecycle.js +47 -0
- package/dist/cjs/runtime/electron-lifecycle.js.map +1 -0
- package/dist/cjs/runtime/electron-main.d.ts +24 -0
- package/dist/cjs/runtime/electron-main.d.ts.map +1 -0
- package/dist/cjs/runtime/electron-main.js +102 -0
- package/dist/cjs/runtime/electron-main.js.map +1 -0
- package/dist/cjs/runtime/electron-renderer.d.ts +26 -0
- package/dist/cjs/runtime/electron-renderer.d.ts.map +1 -0
- package/dist/cjs/runtime/electron-renderer.js +33 -0
- package/dist/cjs/runtime/electron-renderer.js.map +1 -0
- package/dist/cjs/runtime/electron.d.ts +20 -0
- package/dist/cjs/runtime/electron.d.ts.map +1 -0
- package/dist/cjs/runtime/electron.js +27 -0
- package/dist/cjs/runtime/electron.js.map +1 -0
- package/dist/cjs/runtime/index.d.ts +21 -0
- package/dist/cjs/runtime/index.d.ts.map +1 -0
- package/dist/cjs/runtime/index.js +41 -0
- package/dist/cjs/runtime/index.js.map +1 -0
- package/dist/cjs/runtime/node.d.ts +27 -0
- package/dist/cjs/runtime/node.d.ts.map +1 -0
- package/dist/cjs/runtime/node.js +126 -0
- package/dist/cjs/runtime/node.js.map +1 -0
- package/dist/cjs/runtime/process-lifecycle.d.ts +13 -0
- package/dist/cjs/runtime/process-lifecycle.d.ts.map +1 -0
- package/dist/cjs/runtime/process-lifecycle.js +80 -0
- package/dist/cjs/runtime/process-lifecycle.js.map +1 -0
- package/dist/cjs/runtime/web-lifecycle.d.ts +13 -0
- package/dist/cjs/runtime/web-lifecycle.d.ts.map +1 -0
- package/dist/cjs/runtime/web-lifecycle.js +39 -0
- package/dist/cjs/runtime/web-lifecycle.js.map +1 -0
- package/dist/cjs/runtime/web.d.ts +14 -0
- package/dist/cjs/runtime/web.d.ts.map +1 -0
- package/dist/cjs/runtime/web.js +61 -0
- package/dist/cjs/runtime/web.js.map +1 -0
- package/dist/cjs/shims/index.browser.d.ts +26 -0
- package/dist/cjs/shims/index.browser.d.ts.map +1 -0
- package/dist/cjs/shims/index.browser.js +67 -0
- package/dist/cjs/shims/index.browser.js.map +1 -0
- package/dist/cjs/shims/index.d.ts +15 -0
- package/dist/cjs/shims/index.d.ts.map +1 -0
- package/dist/cjs/shims/index.js +39 -0
- package/dist/cjs/shims/index.js.map +1 -0
- package/dist/cjs/transport/cluster-ipc.d.ts +36 -0
- package/dist/cjs/transport/cluster-ipc.d.ts.map +1 -0
- package/dist/cjs/transport/cluster-ipc.js +76 -0
- package/dist/cjs/transport/cluster-ipc.js.map +1 -0
- package/dist/cjs/transport/console.d.ts +28 -0
- package/dist/cjs/transport/console.d.ts.map +1 -0
- package/dist/cjs/transport/console.js +48 -0
- package/dist/cjs/transport/console.js.map +1 -0
- package/dist/cjs/transport/electron-ipc.d.ts +69 -0
- package/dist/cjs/transport/electron-ipc.d.ts.map +1 -0
- package/dist/cjs/transport/electron-ipc.js +153 -0
- package/dist/cjs/transport/electron-ipc.js.map +1 -0
- package/dist/cjs/transport/file.d.ts +190 -0
- package/dist/cjs/transport/file.d.ts.map +1 -0
- package/dist/cjs/transport/file.js +666 -0
- package/dist/cjs/transport/file.js.map +1 -0
- package/dist/cjs/transport/index.d.ts +9 -0
- package/dist/cjs/transport/index.d.ts.map +1 -0
- package/dist/cjs/transport/index.js +25 -0
- package/dist/cjs/transport/index.js.map +1 -0
- package/dist/cjs/transport/live.d.ts +72 -0
- package/dist/cjs/transport/live.d.ts.map +1 -0
- package/dist/cjs/transport/live.js +104 -0
- package/dist/cjs/transport/live.js.map +1 -0
- package/dist/cjs/transport/otlp.d.ts +97 -0
- package/dist/cjs/transport/otlp.d.ts.map +1 -0
- package/dist/cjs/transport/otlp.js +194 -0
- package/dist/cjs/transport/otlp.js.map +1 -0
- package/dist/cjs/transport/rotating-file.d.ts +67 -0
- package/dist/cjs/transport/rotating-file.d.ts.map +1 -0
- package/dist/cjs/transport/rotating-file.js +179 -0
- package/dist/cjs/transport/rotating-file.js.map +1 -0
- package/dist/cjs/transport/transport.d.ts +35 -0
- package/dist/cjs/transport/transport.d.ts.map +1 -0
- package/dist/cjs/transport/transport.js +3 -0
- package/dist/cjs/transport/transport.js.map +1 -0
- package/dist/cjs/transport/worker-ipc.d.ts +43 -0
- package/dist/cjs/transport/worker-ipc.d.ts.map +1 -0
- package/dist/cjs/transport/worker-ipc.js +106 -0
- package/dist/cjs/transport/worker-ipc.js.map +1 -0
- package/dist/cjs/types.d.ts +72 -0
- package/dist/cjs/types.d.ts.map +1 -0
- package/dist/cjs/types.js +45 -0
- package/dist/cjs/types.js.map +1 -0
- package/dist/esm/context/async-context.browser.d.ts +16 -0
- package/dist/esm/context/async-context.browser.d.ts.map +1 -0
- package/dist/esm/context/async-context.browser.js +25 -0
- package/dist/esm/context/async-context.browser.js.map +1 -0
- package/dist/esm/context/async-context.d.ts +10 -0
- package/dist/esm/context/async-context.d.ts.map +1 -0
- package/dist/esm/context/async-context.js +33 -0
- package/dist/esm/context/async-context.js.map +1 -0
- package/dist/esm/context/context.d.ts +33 -0
- package/dist/esm/context/context.d.ts.map +1 -0
- package/dist/esm/context/context.js +52 -0
- package/dist/esm/context/context.js.map +1 -0
- package/dist/esm/context/index.d.ts +3 -0
- package/dist/esm/context/index.d.ts.map +1 -0
- package/dist/esm/context/index.js +3 -0
- package/dist/esm/context/index.js.map +1 -0
- package/dist/esm/core/entry.d.ts +30 -0
- package/dist/esm/core/entry.d.ts.map +1 -0
- package/dist/esm/core/entry.js +34 -0
- package/dist/esm/core/entry.js.map +1 -0
- package/dist/esm/core/index.d.ts +7 -0
- package/dist/esm/core/index.d.ts.map +1 -0
- package/dist/esm/core/index.js +6 -0
- package/dist/esm/core/index.js.map +1 -0
- package/dist/esm/core/level.d.ts +12 -0
- package/dist/esm/core/level.d.ts.map +1 -0
- package/dist/esm/core/level.js +25 -0
- package/dist/esm/core/level.js.map +1 -0
- package/dist/esm/core/logger.d.ts +271 -0
- package/dist/esm/core/logger.d.ts.map +1 -0
- package/dist/esm/core/logger.js +747 -0
- package/dist/esm/core/logger.js.map +1 -0
- package/dist/esm/core/printf.d.ts +34 -0
- package/dist/esm/core/printf.d.ts.map +1 -0
- package/dist/esm/core/printf.js +129 -0
- package/dist/esm/core/printf.js.map +1 -0
- package/dist/esm/index.d.ts +40 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +38 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/pipeline/filter.d.ts +10 -0
- package/dist/esm/pipeline/filter.d.ts.map +1 -0
- package/dist/esm/pipeline/filter.js +11 -0
- package/dist/esm/pipeline/filter.js.map +1 -0
- package/dist/esm/pipeline/formatter.d.ts +19 -0
- package/dist/esm/pipeline/formatter.d.ts.map +1 -0
- package/dist/esm/pipeline/formatter.js +179 -0
- package/dist/esm/pipeline/formatter.js.map +1 -0
- package/dist/esm/pipeline/index.d.ts +6 -0
- package/dist/esm/pipeline/index.d.ts.map +1 -0
- package/dist/esm/pipeline/index.js +6 -0
- package/dist/esm/pipeline/index.js.map +1 -0
- package/dist/esm/pipeline/pipeline.d.ts +45 -0
- package/dist/esm/pipeline/pipeline.d.ts.map +1 -0
- package/dist/esm/pipeline/pipeline.js +76 -0
- package/dist/esm/pipeline/pipeline.js.map +1 -0
- package/dist/esm/pipeline/processor.d.ts +67 -0
- package/dist/esm/pipeline/processor.d.ts.map +1 -0
- package/dist/esm/pipeline/processor.js +277 -0
- package/dist/esm/pipeline/processor.js.map +1 -0
- package/dist/esm/pipeline/sampler.d.ts +45 -0
- package/dist/esm/pipeline/sampler.d.ts.map +1 -0
- package/dist/esm/pipeline/sampler.js +59 -0
- package/dist/esm/pipeline/sampler.js.map +1 -0
- package/dist/esm/plugin/index.d.ts +4 -0
- package/dist/esm/plugin/index.d.ts.map +1 -0
- package/dist/esm/plugin/index.js +4 -0
- package/dist/esm/plugin/index.js.map +1 -0
- package/dist/esm/plugin/manager.d.ts +38 -0
- package/dist/esm/plugin/manager.d.ts.map +1 -0
- package/dist/esm/plugin/manager.js +75 -0
- package/dist/esm/plugin/manager.js.map +1 -0
- package/dist/esm/plugin/otel-trace.d.ts +19 -0
- package/dist/esm/plugin/otel-trace.d.ts.map +1 -0
- package/dist/esm/plugin/otel-trace.js +55 -0
- package/dist/esm/plugin/otel-trace.js.map +1 -0
- package/dist/esm/plugin/plugin.d.ts +41 -0
- package/dist/esm/plugin/plugin.d.ts.map +1 -0
- package/dist/esm/plugin/plugin.js +2 -0
- package/dist/esm/plugin/plugin.js.map +1 -0
- package/dist/esm/runtime/adapter.d.ts +81 -0
- package/dist/esm/runtime/adapter.d.ts.map +1 -0
- package/dist/esm/runtime/adapter.js +2 -0
- package/dist/esm/runtime/adapter.js.map +1 -0
- package/dist/esm/runtime/defaults.d.ts +27 -0
- package/dist/esm/runtime/defaults.d.ts.map +1 -0
- package/dist/esm/runtime/defaults.js +27 -0
- package/dist/esm/runtime/defaults.js.map +1 -0
- package/dist/esm/runtime/electron-binding.browser.d.ts +10 -0
- package/dist/esm/runtime/electron-binding.browser.d.ts.map +1 -0
- package/dist/esm/runtime/electron-binding.browser.js +13 -0
- package/dist/esm/runtime/electron-binding.browser.js.map +1 -0
- package/dist/esm/runtime/electron-binding.d.ts +24 -0
- package/dist/esm/runtime/electron-binding.d.ts.map +1 -0
- package/dist/esm/runtime/electron-binding.js +44 -0
- package/dist/esm/runtime/electron-binding.js.map +1 -0
- package/dist/esm/runtime/electron-lifecycle.d.ts +17 -0
- package/dist/esm/runtime/electron-lifecycle.d.ts.map +1 -0
- package/dist/esm/runtime/electron-lifecycle.js +44 -0
- package/dist/esm/runtime/electron-lifecycle.js.map +1 -0
- package/dist/esm/runtime/electron-main.d.ts +24 -0
- package/dist/esm/runtime/electron-main.d.ts.map +1 -0
- package/dist/esm/runtime/electron-main.js +99 -0
- package/dist/esm/runtime/electron-main.js.map +1 -0
- package/dist/esm/runtime/electron-renderer.d.ts +26 -0
- package/dist/esm/runtime/electron-renderer.d.ts.map +1 -0
- package/dist/esm/runtime/electron-renderer.js +30 -0
- package/dist/esm/runtime/electron-renderer.js.map +1 -0
- package/dist/esm/runtime/electron.d.ts +20 -0
- package/dist/esm/runtime/electron.d.ts.map +1 -0
- package/dist/esm/runtime/electron.js +21 -0
- package/dist/esm/runtime/electron.js.map +1 -0
- package/dist/esm/runtime/index.d.ts +21 -0
- package/dist/esm/runtime/index.d.ts.map +1 -0
- package/dist/esm/runtime/index.js +29 -0
- package/dist/esm/runtime/index.js.map +1 -0
- package/dist/esm/runtime/node.d.ts +27 -0
- package/dist/esm/runtime/node.d.ts.map +1 -0
- package/dist/esm/runtime/node.js +123 -0
- package/dist/esm/runtime/node.js.map +1 -0
- package/dist/esm/runtime/process-lifecycle.d.ts +13 -0
- package/dist/esm/runtime/process-lifecycle.d.ts.map +1 -0
- package/dist/esm/runtime/process-lifecycle.js +77 -0
- package/dist/esm/runtime/process-lifecycle.js.map +1 -0
- package/dist/esm/runtime/web-lifecycle.d.ts +13 -0
- package/dist/esm/runtime/web-lifecycle.d.ts.map +1 -0
- package/dist/esm/runtime/web-lifecycle.js +36 -0
- package/dist/esm/runtime/web-lifecycle.js.map +1 -0
- package/dist/esm/runtime/web.d.ts +14 -0
- package/dist/esm/runtime/web.d.ts.map +1 -0
- package/dist/esm/runtime/web.js +58 -0
- package/dist/esm/runtime/web.js.map +1 -0
- package/dist/esm/shims/index.browser.d.ts +26 -0
- package/dist/esm/shims/index.browser.d.ts.map +1 -0
- package/dist/esm/shims/index.browser.js +54 -0
- package/dist/esm/shims/index.browser.js.map +1 -0
- package/dist/esm/shims/index.d.ts +15 -0
- package/dist/esm/shims/index.d.ts.map +1 -0
- package/dist/esm/shims/index.js +22 -0
- package/dist/esm/shims/index.js.map +1 -0
- package/dist/esm/transport/cluster-ipc.d.ts +36 -0
- package/dist/esm/transport/cluster-ipc.d.ts.map +1 -0
- package/dist/esm/transport/cluster-ipc.js +71 -0
- package/dist/esm/transport/cluster-ipc.js.map +1 -0
- package/dist/esm/transport/console.d.ts +28 -0
- package/dist/esm/transport/console.d.ts.map +1 -0
- package/dist/esm/transport/console.js +44 -0
- package/dist/esm/transport/console.js.map +1 -0
- package/dist/esm/transport/electron-ipc.d.ts +69 -0
- package/dist/esm/transport/electron-ipc.d.ts.map +1 -0
- package/dist/esm/transport/electron-ipc.js +146 -0
- package/dist/esm/transport/electron-ipc.js.map +1 -0
- package/dist/esm/transport/file.d.ts +190 -0
- package/dist/esm/transport/file.d.ts.map +1 -0
- package/dist/esm/transport/file.js +662 -0
- package/dist/esm/transport/file.js.map +1 -0
- package/dist/esm/transport/index.d.ts +9 -0
- package/dist/esm/transport/index.d.ts.map +1 -0
- package/dist/esm/transport/index.js +9 -0
- package/dist/esm/transport/index.js.map +1 -0
- package/dist/esm/transport/live.d.ts +72 -0
- package/dist/esm/transport/live.d.ts.map +1 -0
- package/dist/esm/transport/live.js +100 -0
- package/dist/esm/transport/live.js.map +1 -0
- package/dist/esm/transport/otlp.d.ts +97 -0
- package/dist/esm/transport/otlp.d.ts.map +1 -0
- package/dist/esm/transport/otlp.js +190 -0
- package/dist/esm/transport/otlp.js.map +1 -0
- package/dist/esm/transport/rotating-file.d.ts +67 -0
- package/dist/esm/transport/rotating-file.d.ts.map +1 -0
- package/dist/esm/transport/rotating-file.js +175 -0
- package/dist/esm/transport/rotating-file.js.map +1 -0
- package/dist/esm/transport/transport.d.ts +35 -0
- package/dist/esm/transport/transport.d.ts.map +1 -0
- package/dist/esm/transport/transport.js +2 -0
- package/dist/esm/transport/transport.js.map +1 -0
- package/dist/esm/transport/worker-ipc.d.ts +43 -0
- package/dist/esm/transport/worker-ipc.d.ts.map +1 -0
- package/dist/esm/transport/worker-ipc.js +101 -0
- package/dist/esm/transport/worker-ipc.js.map +1 -0
- package/dist/esm/types.d.ts +72 -0
- package/dist/esm/types.d.ts.map +1 -0
- package/dist/esm/types.js +39 -0
- package/dist/esm/types.js.map +1 -0
- package/package.json +128 -0
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { combineFilters } from './filter.js';
|
|
2
|
+
/**
|
|
3
|
+
* The processing pipeline sits between the Logger (entry creation) and the
|
|
4
|
+
* Transports (output). For each entry it:
|
|
5
|
+
*
|
|
6
|
+
* 1. runs all {@link Filter}s — if any returns `false` the entry is dropped;
|
|
7
|
+
* 2. runs all {@link Processor}s in order, allowing enrichment / redaction;
|
|
8
|
+
* 3. exposes a {@link Formatter} used by transports to serialize the entry.
|
|
9
|
+
*/
|
|
10
|
+
export class Pipeline {
|
|
11
|
+
constructor(options = {}) {
|
|
12
|
+
this.cachedFilter = undefined;
|
|
13
|
+
this.filters = options.filters ? [...options.filters] : [];
|
|
14
|
+
this.processors = options.processors ? [...options.processors] : [];
|
|
15
|
+
this.formatter = options.formatter ?? ((e) => e);
|
|
16
|
+
}
|
|
17
|
+
addFilter(filter) {
|
|
18
|
+
this.filters.push(filter);
|
|
19
|
+
this.cachedFilter = undefined;
|
|
20
|
+
}
|
|
21
|
+
addProcessor(processor) {
|
|
22
|
+
this.processors.push(processor);
|
|
23
|
+
}
|
|
24
|
+
removeFilter(filter) {
|
|
25
|
+
const i = this.filters.indexOf(filter);
|
|
26
|
+
if (i >= 0)
|
|
27
|
+
this.filters.splice(i, 1);
|
|
28
|
+
this.cachedFilter = undefined;
|
|
29
|
+
}
|
|
30
|
+
removeProcessor(processor) {
|
|
31
|
+
const i = this.processors.indexOf(processor);
|
|
32
|
+
if (i >= 0)
|
|
33
|
+
this.processors.splice(i, 1);
|
|
34
|
+
}
|
|
35
|
+
setFormatter(formatter) {
|
|
36
|
+
this.formatter = formatter;
|
|
37
|
+
}
|
|
38
|
+
getFormatter() {
|
|
39
|
+
return this.formatter;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Run filters and processors. Returns `null` when the entry is filtered out.
|
|
43
|
+
*/
|
|
44
|
+
process(entry) {
|
|
45
|
+
if (this.filters.length) {
|
|
46
|
+
if (this.cachedFilter === undefined) {
|
|
47
|
+
this.cachedFilter =
|
|
48
|
+
this.filters.length === 1 ? this.filters[0] : combineFilters(this.filters);
|
|
49
|
+
}
|
|
50
|
+
try {
|
|
51
|
+
if (!this.cachedFilter(entry)) {
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
catch (err) {
|
|
56
|
+
this.onError?.(err, { phase: 'filter', entry });
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
let current = entry;
|
|
61
|
+
for (const processor of this.processors) {
|
|
62
|
+
try {
|
|
63
|
+
current = processor(current);
|
|
64
|
+
}
|
|
65
|
+
catch (err) {
|
|
66
|
+
// A broken processor must not crash logging. Keep the last good entry
|
|
67
|
+
// and continue with the remaining processors.
|
|
68
|
+
this.onError?.(err, { phase: 'process', entry });
|
|
69
|
+
}
|
|
70
|
+
if (!current)
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
return current;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=pipeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../../src/pipeline/pipeline.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import type { LogEntry } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* A Processor transforms a log entry before it is formatted. Processors must
|
|
4
|
+
* return (the same or a new) entry. They are useful for enrichment, redaction
|
|
5
|
+
* or normalization.
|
|
6
|
+
*/
|
|
7
|
+
export type Processor = (entry: LogEntry) => LogEntry;
|
|
8
|
+
/**
|
|
9
|
+
* Default processor: returns the entry unchanged.
|
|
10
|
+
*/
|
|
11
|
+
export declare const identityProcessor: Processor;
|
|
12
|
+
/**
|
|
13
|
+
* Create a processor that redacts sensitive data before formatting. It walks
|
|
14
|
+
* `context`, `metadata` and each element of `args`, replacing any value whose
|
|
15
|
+
* path matches one of `keys` with `replacement` (default `"[REDACTED]"`).
|
|
16
|
+
*
|
|
17
|
+
* Matching is **structural** — the original objects are never mutated; only the
|
|
18
|
+
* branches that actually contain a match are cloned. When nothing matches the
|
|
19
|
+
* entry is returned unchanged (same reference), so the common "no secret" case
|
|
20
|
+
* adds no allocation.
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* createRedactProcessor(['password']) // any `password` at any depth
|
|
24
|
+
* createRedactProcessor(['user.password']) // only `user.password`
|
|
25
|
+
* createRedactProcessor(['*.token', 'user.*']) // wildcards
|
|
26
|
+
*/
|
|
27
|
+
/**
|
|
28
|
+
* Common secret / PII key names redacted by {@link createRedactProcessor} when
|
|
29
|
+
* no explicit key list is supplied. Covers passwords, tokens, API keys, auth
|
|
30
|
+
* headers, cookies, private keys and a few PII fields.
|
|
31
|
+
*/
|
|
32
|
+
export declare const DEFAULT_SENSITIVE_KEYS: string[];
|
|
33
|
+
export declare function createRedactProcessor(keys?: string[], replacement?: unknown): Processor;
|
|
34
|
+
/**
|
|
35
|
+
* A Serializer transforms a single value keyed by `name` before formatting.
|
|
36
|
+
* `entry` is passed for contextual serialization (e.g. capturing the level).
|
|
37
|
+
*/
|
|
38
|
+
export type Serializer = (value: unknown, entry: LogEntry) => unknown;
|
|
39
|
+
/**
|
|
40
|
+
* Create a processor that normalizes values by key name before formatting. For
|
|
41
|
+
* every property named `key` found in `context`, `metadata`, each element of
|
|
42
|
+
* `args` (and the entry's `error`), the matching serializer replaces the value.
|
|
43
|
+
* Matching is by property name at **any depth** (e.g. a `req` serializer runs on
|
|
44
|
+
* any object that has a `req` property).
|
|
45
|
+
*
|
|
46
|
+
* Transformation is **structural** — only the branches that contain a matching
|
|
47
|
+
* key are cloned; when no serializer fires the entry is returned unchanged (same
|
|
48
|
+
* reference), so the common "no serializer matched" case adds no allocation.
|
|
49
|
+
*
|
|
50
|
+
* @example
|
|
51
|
+
* createSerializeProcessor({
|
|
52
|
+
* err: (e) => ({ name: e.name, message: e.message, stack: e.stack }),
|
|
53
|
+
* user: (u) => ({ id: u.id }), // drop the rest of the user object
|
|
54
|
+
* })
|
|
55
|
+
*/
|
|
56
|
+
export declare function createSerializeProcessor(serializers: Record<string, Serializer>): Processor;
|
|
57
|
+
/**
|
|
58
|
+
* A preset of common {@link Serializer}s keyed by the property names they match
|
|
59
|
+
* (`error`, `date`, `buffer`, `url`, `req`, `res`). Spread it into your own
|
|
60
|
+
* serializer map to get safe, compact representations of these types out of the
|
|
61
|
+
* box, e.g. `createSerializeProcessor({ ...createDefaultSerializers(), user })`.
|
|
62
|
+
*
|
|
63
|
+
* Matching is by property name at any depth (see {@link createSerializeProcessor}),
|
|
64
|
+
* so any object with a `req`/`res`/`url`/`error` property is normalized.
|
|
65
|
+
*/
|
|
66
|
+
export declare function createDefaultSerializers(): Record<string, Serializer>;
|
|
67
|
+
//# sourceMappingURL=processor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"processor.d.ts","sourceRoot":"","sources":["../../../src/pipeline/processor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C;;;;GAIG;AACH,MAAM,MAAM,SAAS,GAAG,CAAC,KAAK,EAAE,QAAQ,KAAK,QAAQ,CAAC;AAEtD;;GAEG;AACH,eAAO,MAAM,iBAAiB,EAAE,SAA4B,CAAC;AAwE7D;;;;;;;;;;;;;;GAcG;AACH;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,EAAE,MAAM,EA0B1C,CAAC;AAEF,wBAAgB,qBAAqB,CACnC,IAAI,GAAE,MAAM,EAA2B,EACvC,WAAW,GAAE,OAAsB,GAClC,SAAS,CAoBX;AAED;;;GAGG;AACH,MAAM,MAAM,UAAU,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,KAAK,OAAO,CAAC;AAoCtE;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,SAAS,CA+B3F;AAqCD;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,IAAI,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CASrE"}
|
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default processor: returns the entry unchanged.
|
|
3
|
+
*/
|
|
4
|
+
export const identityProcessor = (entry) => entry;
|
|
5
|
+
/**
|
|
6
|
+
* Compile a redaction spec into a path matcher.
|
|
7
|
+
*
|
|
8
|
+
* - A bare key (no `.` and no `*`), e.g. `"password"`, matches **any** property
|
|
9
|
+
* named that way at any depth (the historical behavior — convenient for
|
|
10
|
+
* common secrets).
|
|
11
|
+
* - A dotted spec, e.g. `"user.password"` or `"*.password"`, matches only the
|
|
12
|
+
* exact path. `*` matches any single key/array index at that position. Numeric
|
|
13
|
+
* array indices are matched positionally (`"list.0.id"`).
|
|
14
|
+
*/
|
|
15
|
+
function compileMatcher(spec) {
|
|
16
|
+
if (!spec.includes('.') && !spec.includes('*')) {
|
|
17
|
+
return (p) => p.length > 0 && p[p.length - 1] === spec;
|
|
18
|
+
}
|
|
19
|
+
const segs = spec.split('.');
|
|
20
|
+
return (p) => {
|
|
21
|
+
if (p.length !== segs.length)
|
|
22
|
+
return false;
|
|
23
|
+
for (let i = 0; i < segs.length; i++) {
|
|
24
|
+
const s = segs[i];
|
|
25
|
+
if (s === '*')
|
|
26
|
+
continue;
|
|
27
|
+
if (String(p[i]) !== s)
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
return true;
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
function redactNode(node, path, matchers, replacement) {
|
|
34
|
+
if (Array.isArray(node)) {
|
|
35
|
+
let changed = false;
|
|
36
|
+
const out = new Array(node.length);
|
|
37
|
+
for (let i = 0; i < node.length; i++) {
|
|
38
|
+
const cp = [...path, i];
|
|
39
|
+
if (matchers.some((m) => m(cp))) {
|
|
40
|
+
out[i] = replacement;
|
|
41
|
+
changed = true;
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
const r = redactNode(node[i], cp, matchers, replacement);
|
|
45
|
+
out[i] = r;
|
|
46
|
+
if (r !== node[i])
|
|
47
|
+
changed = true;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return changed ? out : node;
|
|
51
|
+
}
|
|
52
|
+
if (node !== null && typeof node === 'object') {
|
|
53
|
+
let changed = false;
|
|
54
|
+
const out = {};
|
|
55
|
+
for (const k of Object.keys(node)) {
|
|
56
|
+
const cp = [...path, k];
|
|
57
|
+
const v = node[k];
|
|
58
|
+
if (matchers.some((m) => m(cp))) {
|
|
59
|
+
out[k] = replacement;
|
|
60
|
+
changed = true;
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
const r = redactNode(v, cp, matchers, replacement);
|
|
64
|
+
out[k] = r;
|
|
65
|
+
if (r !== v)
|
|
66
|
+
changed = true;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return changed ? out : node;
|
|
70
|
+
}
|
|
71
|
+
return node;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Create a processor that redacts sensitive data before formatting. It walks
|
|
75
|
+
* `context`, `metadata` and each element of `args`, replacing any value whose
|
|
76
|
+
* path matches one of `keys` with `replacement` (default `"[REDACTED]"`).
|
|
77
|
+
*
|
|
78
|
+
* Matching is **structural** — the original objects are never mutated; only the
|
|
79
|
+
* branches that actually contain a match are cloned. When nothing matches the
|
|
80
|
+
* entry is returned unchanged (same reference), so the common "no secret" case
|
|
81
|
+
* adds no allocation.
|
|
82
|
+
*
|
|
83
|
+
* @example
|
|
84
|
+
* createRedactProcessor(['password']) // any `password` at any depth
|
|
85
|
+
* createRedactProcessor(['user.password']) // only `user.password`
|
|
86
|
+
* createRedactProcessor(['*.token', 'user.*']) // wildcards
|
|
87
|
+
*/
|
|
88
|
+
/**
|
|
89
|
+
* Common secret / PII key names redacted by {@link createRedactProcessor} when
|
|
90
|
+
* no explicit key list is supplied. Covers passwords, tokens, API keys, auth
|
|
91
|
+
* headers, cookies, private keys and a few PII fields.
|
|
92
|
+
*/
|
|
93
|
+
export const DEFAULT_SENSITIVE_KEYS = [
|
|
94
|
+
'password',
|
|
95
|
+
'passwd',
|
|
96
|
+
'pwd',
|
|
97
|
+
'secret',
|
|
98
|
+
'token',
|
|
99
|
+
'accessToken',
|
|
100
|
+
'refreshToken',
|
|
101
|
+
'apiKey',
|
|
102
|
+
'api_key',
|
|
103
|
+
'authorization',
|
|
104
|
+
'auth',
|
|
105
|
+
'cookie',
|
|
106
|
+
'setCookie',
|
|
107
|
+
'set-cookie',
|
|
108
|
+
'privateKey',
|
|
109
|
+
'private_key',
|
|
110
|
+
'credentials',
|
|
111
|
+
'credential',
|
|
112
|
+
'sessionId',
|
|
113
|
+
'session',
|
|
114
|
+
'csrfToken',
|
|
115
|
+
'csrf',
|
|
116
|
+
'otp',
|
|
117
|
+
'ssn',
|
|
118
|
+
'x-api-key',
|
|
119
|
+
];
|
|
120
|
+
export function createRedactProcessor(keys = DEFAULT_SENSITIVE_KEYS, replacement = '[REDACTED]') {
|
|
121
|
+
if (keys.length === 0)
|
|
122
|
+
return identityProcessor;
|
|
123
|
+
const matchers = keys.map(compileMatcher);
|
|
124
|
+
return (entry) => {
|
|
125
|
+
const context = redactNode(entry.context, [], matchers, replacement);
|
|
126
|
+
const metadata = redactNode(entry.metadata, [], matchers, replacement);
|
|
127
|
+
let argsChanged = false;
|
|
128
|
+
const args = entry.args.map((a) => {
|
|
129
|
+
const r = redactNode(a, [], matchers, replacement);
|
|
130
|
+
if (r !== a)
|
|
131
|
+
argsChanged = true;
|
|
132
|
+
return r;
|
|
133
|
+
});
|
|
134
|
+
if (context === entry.context && metadata === entry.metadata && !argsChanged) {
|
|
135
|
+
return entry;
|
|
136
|
+
}
|
|
137
|
+
return { ...entry, context, metadata, args: argsChanged ? args : entry.args };
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
function serializeNode(node, serializers, entry) {
|
|
141
|
+
if (Array.isArray(node)) {
|
|
142
|
+
let changed = false;
|
|
143
|
+
const out = new Array(node.length);
|
|
144
|
+
for (let i = 0; i < node.length; i++) {
|
|
145
|
+
const r = serializeNode(node[i], serializers, entry);
|
|
146
|
+
out[i] = r;
|
|
147
|
+
if (r !== node[i])
|
|
148
|
+
changed = true;
|
|
149
|
+
}
|
|
150
|
+
return changed ? out : node;
|
|
151
|
+
}
|
|
152
|
+
if (node !== null && typeof node === 'object') {
|
|
153
|
+
let changed = false;
|
|
154
|
+
const out = {};
|
|
155
|
+
for (const k of Object.keys(node)) {
|
|
156
|
+
const v = node[k];
|
|
157
|
+
if (serializers[k]) {
|
|
158
|
+
out[k] = serializers[k](v, entry);
|
|
159
|
+
changed = true;
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
const r = serializeNode(v, serializers, entry);
|
|
163
|
+
out[k] = r;
|
|
164
|
+
if (r !== v)
|
|
165
|
+
changed = true;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
return changed ? out : node;
|
|
169
|
+
}
|
|
170
|
+
return node;
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Create a processor that normalizes values by key name before formatting. For
|
|
174
|
+
* every property named `key` found in `context`, `metadata`, each element of
|
|
175
|
+
* `args` (and the entry's `error`), the matching serializer replaces the value.
|
|
176
|
+
* Matching is by property name at **any depth** (e.g. a `req` serializer runs on
|
|
177
|
+
* any object that has a `req` property).
|
|
178
|
+
*
|
|
179
|
+
* Transformation is **structural** — only the branches that contain a matching
|
|
180
|
+
* key are cloned; when no serializer fires the entry is returned unchanged (same
|
|
181
|
+
* reference), so the common "no serializer matched" case adds no allocation.
|
|
182
|
+
*
|
|
183
|
+
* @example
|
|
184
|
+
* createSerializeProcessor({
|
|
185
|
+
* err: (e) => ({ name: e.name, message: e.message, stack: e.stack }),
|
|
186
|
+
* user: (u) => ({ id: u.id }), // drop the rest of the user object
|
|
187
|
+
* })
|
|
188
|
+
*/
|
|
189
|
+
export function createSerializeProcessor(serializers) {
|
|
190
|
+
if (!serializers || Object.keys(serializers).length === 0)
|
|
191
|
+
return identityProcessor;
|
|
192
|
+
return (entry) => {
|
|
193
|
+
const context = serializeNode(entry.context, serializers, entry);
|
|
194
|
+
const metadata = serializeNode(entry.metadata, serializers, entry);
|
|
195
|
+
let argsChanged = false;
|
|
196
|
+
const args = entry.args.map((a) => {
|
|
197
|
+
const r = serializeNode(a, serializers, entry);
|
|
198
|
+
if (r !== a)
|
|
199
|
+
argsChanged = true;
|
|
200
|
+
return r;
|
|
201
|
+
});
|
|
202
|
+
let error = entry.error;
|
|
203
|
+
let errorChanged = false;
|
|
204
|
+
if (error !== undefined && serializers['error']) {
|
|
205
|
+
const r = serializers['error'](error, entry);
|
|
206
|
+
if (r !== error) {
|
|
207
|
+
error = r;
|
|
208
|
+
errorChanged = true;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
if (context === entry.context && metadata === entry.metadata && !argsChanged && !errorChanged) {
|
|
212
|
+
return entry;
|
|
213
|
+
}
|
|
214
|
+
return {
|
|
215
|
+
...entry,
|
|
216
|
+
context,
|
|
217
|
+
metadata,
|
|
218
|
+
args: argsChanged ? args : entry.args,
|
|
219
|
+
...(errorChanged ? { error } : {}),
|
|
220
|
+
};
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
function serializeErrorValue(v) {
|
|
224
|
+
return v instanceof Error ? { name: v.name, message: v.message, stack: v.stack } : v;
|
|
225
|
+
}
|
|
226
|
+
function serializeBufferValue(v) {
|
|
227
|
+
if (typeof Buffer !== 'undefined' && Buffer.isBuffer(v))
|
|
228
|
+
return `Buffer(${v.length})`;
|
|
229
|
+
if (v instanceof ArrayBuffer)
|
|
230
|
+
return `ArrayBuffer(${v.byteLength})`;
|
|
231
|
+
if (ArrayBuffer.isView(v)) {
|
|
232
|
+
return `${v.constructor.name}(${v.byteLength})`;
|
|
233
|
+
}
|
|
234
|
+
return v;
|
|
235
|
+
}
|
|
236
|
+
function serializeUrlValue(v) {
|
|
237
|
+
return v instanceof URL ? v.href : v;
|
|
238
|
+
}
|
|
239
|
+
function serializeDateValue(v) {
|
|
240
|
+
return v instanceof Date ? v.toISOString() : v;
|
|
241
|
+
}
|
|
242
|
+
function serializeRequestValue(v) {
|
|
243
|
+
if (!v || typeof v !== 'object')
|
|
244
|
+
return v;
|
|
245
|
+
const r = v;
|
|
246
|
+
if (!('method' in r) && !('url' in r))
|
|
247
|
+
return v;
|
|
248
|
+
return { method: r.method, url: r.url, headers: r.headers };
|
|
249
|
+
}
|
|
250
|
+
function serializeResponseValue(v) {
|
|
251
|
+
if (!v || typeof v !== 'object')
|
|
252
|
+
return v;
|
|
253
|
+
const r = v;
|
|
254
|
+
if (!('status' in r) && !('statusCode' in r))
|
|
255
|
+
return v;
|
|
256
|
+
return { status: r.status ?? r.statusCode, headers: r.headers };
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* A preset of common {@link Serializer}s keyed by the property names they match
|
|
260
|
+
* (`error`, `date`, `buffer`, `url`, `req`, `res`). Spread it into your own
|
|
261
|
+
* serializer map to get safe, compact representations of these types out of the
|
|
262
|
+
* box, e.g. `createSerializeProcessor({ ...createDefaultSerializers(), user })`.
|
|
263
|
+
*
|
|
264
|
+
* Matching is by property name at any depth (see {@link createSerializeProcessor}),
|
|
265
|
+
* so any object with a `req`/`res`/`url`/`error` property is normalized.
|
|
266
|
+
*/
|
|
267
|
+
export function createDefaultSerializers() {
|
|
268
|
+
return {
|
|
269
|
+
error: serializeErrorValue,
|
|
270
|
+
date: serializeDateValue,
|
|
271
|
+
buffer: serializeBufferValue,
|
|
272
|
+
url: serializeUrlValue,
|
|
273
|
+
req: serializeRequestValue,
|
|
274
|
+
res: serializeResponseValue,
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
//# sourceMappingURL=processor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"processor.js","sourceRoot":"","sources":["../../../src/pipeline/processor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { LogLevelName } from '../types.js';
|
|
2
|
+
import type { Filter } from './filter.js';
|
|
3
|
+
export interface SamplingOptions {
|
|
4
|
+
/**
|
|
5
|
+
* Probability (0..1) that a sampled-level entry is kept. `1` (default) keeps
|
|
6
|
+
* everything; `0` drops all sampled-level entries. Applied before rate
|
|
7
|
+
* limiting. Sampling is intentionally lossy — only enable it for high-volume,
|
|
8
|
+
* low-value levels (e.g. `debug`/`info`).
|
|
9
|
+
*/
|
|
10
|
+
rate?: number;
|
|
11
|
+
/**
|
|
12
|
+
* Restrict sampling to these level names. Entries of other levels always pass
|
|
13
|
+
* through untouched. Omit to sample every level.
|
|
14
|
+
*/
|
|
15
|
+
levels?: LogLevelName[];
|
|
16
|
+
/**
|
|
17
|
+
* Maximum entries kept per second (token-bucket refill rate). When set, bursts
|
|
18
|
+
* up to `burst` are allowed, then entries are dropped until tokens refill.
|
|
19
|
+
* Off when unset. Combined with `rate` via logical AND.
|
|
20
|
+
*/
|
|
21
|
+
maxPerSecond?: number;
|
|
22
|
+
/** Burst capacity for `maxPerSecond`; defaults to `maxPerSecond`. */
|
|
23
|
+
burst?: number;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Build a {@link Filter} that drops log entries to reduce volume. Two orthogonal
|
|
27
|
+
* strategies are supported and combined with a logical AND:
|
|
28
|
+
*
|
|
29
|
+
* - **probabilistic** (`rate`): keep each entry with probability `rate`;
|
|
30
|
+
* - **rate limiting** (`maxPerSecond` + `burst`): a token bucket caps throughput
|
|
31
|
+
* per second, tolerating short bursts.
|
|
32
|
+
*
|
|
33
|
+
* Entries outside `levels` are always kept. Because this is a filter, sampled
|
|
34
|
+
* entries never reach processors, formatters or transports — so sampling is also
|
|
35
|
+
* the cheapest way to cut cost under load.
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* ```ts
|
|
39
|
+
* logger.getPipeline().addFilter(
|
|
40
|
+
* createSampler({ levels: ['debug', 'info'], maxPerSecond: 100, burst: 200 }),
|
|
41
|
+
* );
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
export declare function createSampler(options?: SamplingOptions): Filter;
|
|
45
|
+
//# sourceMappingURL=sampler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sampler.d.ts","sourceRoot":"","sources":["../../../src/pipeline/sampler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAY,YAAY,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,WAAW,eAAe;IAC9B;;;;;OAKG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,MAAM,CAAC,EAAE,YAAY,EAAE,CAAC;IACxB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,qEAAqE;IACrE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,aAAa,CAAC,OAAO,GAAE,eAAoB,GAAG,MAAM,CAuCnE"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build a {@link Filter} that drops log entries to reduce volume. Two orthogonal
|
|
3
|
+
* strategies are supported and combined with a logical AND:
|
|
4
|
+
*
|
|
5
|
+
* - **probabilistic** (`rate`): keep each entry with probability `rate`;
|
|
6
|
+
* - **rate limiting** (`maxPerSecond` + `burst`): a token bucket caps throughput
|
|
7
|
+
* per second, tolerating short bursts.
|
|
8
|
+
*
|
|
9
|
+
* Entries outside `levels` are always kept. Because this is a filter, sampled
|
|
10
|
+
* entries never reach processors, formatters or transports — so sampling is also
|
|
11
|
+
* the cheapest way to cut cost under load.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```ts
|
|
15
|
+
* logger.getPipeline().addFilter(
|
|
16
|
+
* createSampler({ levels: ['debug', 'info'], maxPerSecond: 100, burst: 200 }),
|
|
17
|
+
* );
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
export function createSampler(options = {}) {
|
|
21
|
+
const rate = options.rate ?? 1;
|
|
22
|
+
const levelSet = options.levels ? new Set(options.levels) : undefined;
|
|
23
|
+
const maxPerSecond = options.maxPerSecond;
|
|
24
|
+
const capacity = maxPerSecond !== undefined ? (options.burst ?? maxPerSecond) : 0;
|
|
25
|
+
// Token-bucket state for rate limiting; lazily initialized on first use.
|
|
26
|
+
let tokens = capacity;
|
|
27
|
+
let lastRefill = 0;
|
|
28
|
+
return (entry) => {
|
|
29
|
+
// Levels not opted into sampling always pass through.
|
|
30
|
+
if (levelSet && !levelSet.has(entry.levelName))
|
|
31
|
+
return true;
|
|
32
|
+
// Probabilistic sampling.
|
|
33
|
+
if (rate < 1 && Math.random() >= rate)
|
|
34
|
+
return false;
|
|
35
|
+
// Rate limiting (token bucket keyed on the entry's ms timestamp).
|
|
36
|
+
if (maxPerSecond !== undefined) {
|
|
37
|
+
const now = entry.timestamp;
|
|
38
|
+
if (lastRefill === 0) {
|
|
39
|
+
lastRefill = now;
|
|
40
|
+
tokens = capacity;
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
const elapsed = now - lastRefill;
|
|
44
|
+
if (elapsed > 0) {
|
|
45
|
+
tokens = Math.min(capacity, tokens + (elapsed * maxPerSecond) / 1000);
|
|
46
|
+
lastRefill = now;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
if (tokens >= 1) {
|
|
50
|
+
tokens -= 1;
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return true;
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=sampler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sampler.js","sourceRoot":"","sources":["../../../src/pipeline/sampler.ts"],"names":[],"mappings":"AA0BA;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,aAAa,CAAC,UAA2B,EAAE;IACzD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC;IAC/B,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACtE,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IAC1C,MAAM,QAAQ,GAAG,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAElF,yEAAyE;IACzE,IAAI,MAAM,GAAG,QAAQ,CAAC;IACtB,IAAI,UAAU,GAAG,CAAC,CAAC;IAEnB,OAAO,CAAC,KAAe,EAAW,EAAE;QAClC,sDAAsD;QACtD,IAAI,QAAQ,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC;YAAE,OAAO,IAAI,CAAC;QAE5D,0BAA0B;QAC1B,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI;YAAE,OAAO,KAAK,CAAC;QAEpD,kEAAkE;QAClE,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;YAC/B,MAAM,GAAG,GAAG,KAAK,CAAC,SAAS,CAAC;YAC5B,IAAI,UAAU,KAAK,CAAC,EAAE,CAAC;gBACrB,UAAU,GAAG,GAAG,CAAC;gBACjB,MAAM,GAAG,QAAQ,CAAC;YACpB,CAAC;iBAAM,CAAC;gBACN,MAAM,OAAO,GAAG,GAAG,GAAG,UAAU,CAAC;gBACjC,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;oBAChB,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,CAAC,OAAO,GAAG,YAAY,CAAC,GAAG,IAAI,CAAC,CAAC;oBACtE,UAAU,GAAG,GAAG,CAAC;gBACnB,CAAC;YACH,CAAC;YACD,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;gBAChB,MAAM,IAAI,CAAC,CAAC;YACd,CAAC;iBAAM,CAAC;gBACN,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/plugin/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/plugin/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { LogEntry } from '../types.js';
|
|
2
|
+
import type { Transport } from '../transport/transport.js';
|
|
3
|
+
import type { Plugin, PluginContext } from './plugin.js';
|
|
4
|
+
/**
|
|
5
|
+
* Manages plugin registration and lifecycle. The logger delegates entry
|
|
6
|
+
* interception and transport registration to this manager.
|
|
7
|
+
*/
|
|
8
|
+
export declare class PluginManager {
|
|
9
|
+
private plugins;
|
|
10
|
+
private host;
|
|
11
|
+
/** Count of plugins with an `onEntry` hook; gates the async intercept path. */
|
|
12
|
+
private entryInterceptors;
|
|
13
|
+
/**
|
|
14
|
+
* Error sink for a plugin's `onEntry` hook. A throwing hook must never drop
|
|
15
|
+
* the entry silently or crash logging; the error is reported and the entry
|
|
16
|
+
* proceeds unchanged.
|
|
17
|
+
*/
|
|
18
|
+
onError?: (pluginName: string, err: unknown, entry: LogEntry) => void;
|
|
19
|
+
constructor(host: PluginContext);
|
|
20
|
+
register(plugin: Plugin): Promise<void>;
|
|
21
|
+
/** Unregister a plugin by name. Its `onDestroy` hook (if any) is invoked. */
|
|
22
|
+
unregister(name: string): void;
|
|
23
|
+
has(name: string): boolean;
|
|
24
|
+
/** True when at least one plugin can intercept entries via `onEntry`. */
|
|
25
|
+
hasEntryInterceptors(): boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Notify plugins that a transport was added (so `onTransport` hooks run).
|
|
28
|
+
* Called by the logger's `addTransport`.
|
|
29
|
+
*/
|
|
30
|
+
notifyTransport(transport: Transport): void;
|
|
31
|
+
/**
|
|
32
|
+
* Run every plugin's `onEntry` hook in registration order. A plugin may
|
|
33
|
+
* return `null` to drop the entry, or a modified entry to pass downstream.
|
|
34
|
+
*/
|
|
35
|
+
intercept(entry: LogEntry): Promise<LogEntry | null>;
|
|
36
|
+
destroy(): Promise<void>;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../../src/plugin/manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEzD;;;GAGG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,IAAI,CAAgB;IAC5B,+EAA+E;IAC/E,OAAO,CAAC,iBAAiB,CAAK;IAC9B;;;;OAIG;IACH,OAAO,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAC;gBAE1D,IAAI,EAAE,aAAa;IAIzB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAS7C,6EAA6E;IAC7E,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAQ9B,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI1B,yEAAyE;IACzE,oBAAoB,IAAI,OAAO;IAI/B;;;OAGG;IACH,eAAe,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI;IAM3C;;;OAGG;IACG,SAAS,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAgBpD,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAM/B"}
|