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,45 @@
|
|
|
1
|
+
import type { LogEntry } from '../types.js';
|
|
2
|
+
import type { Filter } from './filter.js';
|
|
3
|
+
import type { Processor } from './processor.js';
|
|
4
|
+
import type { Formatter } from './formatter.js';
|
|
5
|
+
export interface PipelineOptions {
|
|
6
|
+
filters?: Filter[];
|
|
7
|
+
processors?: Processor[];
|
|
8
|
+
formatter?: Formatter;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* The processing pipeline sits between the Logger (entry creation) and the
|
|
12
|
+
* Transports (output). For each entry it:
|
|
13
|
+
*
|
|
14
|
+
* 1. runs all {@link Filter}s — if any returns `false` the entry is dropped;
|
|
15
|
+
* 2. runs all {@link Processor}s in order, allowing enrichment / redaction;
|
|
16
|
+
* 3. exposes a {@link Formatter} used by transports to serialize the entry.
|
|
17
|
+
*/
|
|
18
|
+
export declare class Pipeline {
|
|
19
|
+
private filters;
|
|
20
|
+
private processors;
|
|
21
|
+
private formatter;
|
|
22
|
+
private cachedFilter;
|
|
23
|
+
/**
|
|
24
|
+
* Error sink for a throwing {@link Filter} or {@link Processor}. The logger
|
|
25
|
+
* wires this to its own global error handler; when unset, the throw is simply
|
|
26
|
+
* swallowed and the entry proceeds unchanged (for processors) or is dropped
|
|
27
|
+
* (for filters).
|
|
28
|
+
*/
|
|
29
|
+
onError?: (err: unknown, info: {
|
|
30
|
+
phase: 'filter' | 'process';
|
|
31
|
+
entry: LogEntry;
|
|
32
|
+
}) => void;
|
|
33
|
+
constructor(options?: PipelineOptions);
|
|
34
|
+
addFilter(filter: Filter): void;
|
|
35
|
+
addProcessor(processor: Processor): void;
|
|
36
|
+
removeFilter(filter: Filter): void;
|
|
37
|
+
removeProcessor(processor: Processor): void;
|
|
38
|
+
setFormatter(formatter: Formatter): void;
|
|
39
|
+
getFormatter(): Formatter;
|
|
40
|
+
/**
|
|
41
|
+
* Run filters and processors. Returns `null` when the entry is filtered out.
|
|
42
|
+
*/
|
|
43
|
+
process(entry: LogEntry): LogEntry | null;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=pipeline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../../src/pipeline/pipeline.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC;IACzB,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB;AAED;;;;;;;GAOG;AACH,qBAAa,QAAQ;IACnB,OAAO,CAAC,OAAO,CAAW;IAC1B,OAAO,CAAC,UAAU,CAAc;IAChC,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,YAAY,CAAiC;IACrD;;;;;OAKG;IACH,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE;QAAE,KAAK,EAAE,QAAQ,GAAG,SAAS,CAAC;QAAC,KAAK,EAAE,QAAQ,CAAA;KAAE,KAAK,IAAI,CAAC;gBAE7E,OAAO,GAAE,eAAoB;IAMzC,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAK/B,YAAY,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI;IAIxC,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAMlC,eAAe,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI;IAK3C,YAAY,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI;IAIxC,YAAY,IAAI,SAAS;IAIzB;;OAEG;IACH,OAAO,CAAC,KAAK,EAAE,QAAQ,GAAG,QAAQ,GAAG,IAAI;CA4B1C"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Pipeline = void 0;
|
|
4
|
+
const filter_js_1 = require("./filter.js");
|
|
5
|
+
/**
|
|
6
|
+
* The processing pipeline sits between the Logger (entry creation) and the
|
|
7
|
+
* Transports (output). For each entry it:
|
|
8
|
+
*
|
|
9
|
+
* 1. runs all {@link Filter}s — if any returns `false` the entry is dropped;
|
|
10
|
+
* 2. runs all {@link Processor}s in order, allowing enrichment / redaction;
|
|
11
|
+
* 3. exposes a {@link Formatter} used by transports to serialize the entry.
|
|
12
|
+
*/
|
|
13
|
+
class Pipeline {
|
|
14
|
+
constructor(options = {}) {
|
|
15
|
+
this.cachedFilter = undefined;
|
|
16
|
+
this.filters = options.filters ? [...options.filters] : [];
|
|
17
|
+
this.processors = options.processors ? [...options.processors] : [];
|
|
18
|
+
this.formatter = options.formatter ?? ((e) => e);
|
|
19
|
+
}
|
|
20
|
+
addFilter(filter) {
|
|
21
|
+
this.filters.push(filter);
|
|
22
|
+
this.cachedFilter = undefined;
|
|
23
|
+
}
|
|
24
|
+
addProcessor(processor) {
|
|
25
|
+
this.processors.push(processor);
|
|
26
|
+
}
|
|
27
|
+
removeFilter(filter) {
|
|
28
|
+
const i = this.filters.indexOf(filter);
|
|
29
|
+
if (i >= 0)
|
|
30
|
+
this.filters.splice(i, 1);
|
|
31
|
+
this.cachedFilter = undefined;
|
|
32
|
+
}
|
|
33
|
+
removeProcessor(processor) {
|
|
34
|
+
const i = this.processors.indexOf(processor);
|
|
35
|
+
if (i >= 0)
|
|
36
|
+
this.processors.splice(i, 1);
|
|
37
|
+
}
|
|
38
|
+
setFormatter(formatter) {
|
|
39
|
+
this.formatter = formatter;
|
|
40
|
+
}
|
|
41
|
+
getFormatter() {
|
|
42
|
+
return this.formatter;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Run filters and processors. Returns `null` when the entry is filtered out.
|
|
46
|
+
*/
|
|
47
|
+
process(entry) {
|
|
48
|
+
if (this.filters.length) {
|
|
49
|
+
if (this.cachedFilter === undefined) {
|
|
50
|
+
this.cachedFilter =
|
|
51
|
+
this.filters.length === 1 ? this.filters[0] : (0, filter_js_1.combineFilters)(this.filters);
|
|
52
|
+
}
|
|
53
|
+
try {
|
|
54
|
+
if (!this.cachedFilter(entry)) {
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
catch (err) {
|
|
59
|
+
this.onError?.(err, { phase: 'filter', entry });
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
let current = entry;
|
|
64
|
+
for (const processor of this.processors) {
|
|
65
|
+
try {
|
|
66
|
+
current = processor(current);
|
|
67
|
+
}
|
|
68
|
+
catch (err) {
|
|
69
|
+
// A broken processor must not crash logging. Keep the last good entry
|
|
70
|
+
// and continue with the remaining processors.
|
|
71
|
+
this.onError?.(err, { phase: 'process', entry });
|
|
72
|
+
}
|
|
73
|
+
if (!current)
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
return current;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
exports.Pipeline = Pipeline;
|
|
80
|
+
//# 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,284 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DEFAULT_SENSITIVE_KEYS = exports.identityProcessor = void 0;
|
|
4
|
+
exports.createRedactProcessor = createRedactProcessor;
|
|
5
|
+
exports.createSerializeProcessor = createSerializeProcessor;
|
|
6
|
+
exports.createDefaultSerializers = createDefaultSerializers;
|
|
7
|
+
/**
|
|
8
|
+
* Default processor: returns the entry unchanged.
|
|
9
|
+
*/
|
|
10
|
+
const identityProcessor = (entry) => entry;
|
|
11
|
+
exports.identityProcessor = identityProcessor;
|
|
12
|
+
/**
|
|
13
|
+
* Compile a redaction spec into a path matcher.
|
|
14
|
+
*
|
|
15
|
+
* - A bare key (no `.` and no `*`), e.g. `"password"`, matches **any** property
|
|
16
|
+
* named that way at any depth (the historical behavior — convenient for
|
|
17
|
+
* common secrets).
|
|
18
|
+
* - A dotted spec, e.g. `"user.password"` or `"*.password"`, matches only the
|
|
19
|
+
* exact path. `*` matches any single key/array index at that position. Numeric
|
|
20
|
+
* array indices are matched positionally (`"list.0.id"`).
|
|
21
|
+
*/
|
|
22
|
+
function compileMatcher(spec) {
|
|
23
|
+
if (!spec.includes('.') && !spec.includes('*')) {
|
|
24
|
+
return (p) => p.length > 0 && p[p.length - 1] === spec;
|
|
25
|
+
}
|
|
26
|
+
const segs = spec.split('.');
|
|
27
|
+
return (p) => {
|
|
28
|
+
if (p.length !== segs.length)
|
|
29
|
+
return false;
|
|
30
|
+
for (let i = 0; i < segs.length; i++) {
|
|
31
|
+
const s = segs[i];
|
|
32
|
+
if (s === '*')
|
|
33
|
+
continue;
|
|
34
|
+
if (String(p[i]) !== s)
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
return true;
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
function redactNode(node, path, matchers, replacement) {
|
|
41
|
+
if (Array.isArray(node)) {
|
|
42
|
+
let changed = false;
|
|
43
|
+
const out = new Array(node.length);
|
|
44
|
+
for (let i = 0; i < node.length; i++) {
|
|
45
|
+
const cp = [...path, i];
|
|
46
|
+
if (matchers.some((m) => m(cp))) {
|
|
47
|
+
out[i] = replacement;
|
|
48
|
+
changed = true;
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
const r = redactNode(node[i], cp, matchers, replacement);
|
|
52
|
+
out[i] = r;
|
|
53
|
+
if (r !== node[i])
|
|
54
|
+
changed = true;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return changed ? out : node;
|
|
58
|
+
}
|
|
59
|
+
if (node !== null && typeof node === 'object') {
|
|
60
|
+
let changed = false;
|
|
61
|
+
const out = {};
|
|
62
|
+
for (const k of Object.keys(node)) {
|
|
63
|
+
const cp = [...path, k];
|
|
64
|
+
const v = node[k];
|
|
65
|
+
if (matchers.some((m) => m(cp))) {
|
|
66
|
+
out[k] = replacement;
|
|
67
|
+
changed = true;
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
const r = redactNode(v, cp, matchers, replacement);
|
|
71
|
+
out[k] = r;
|
|
72
|
+
if (r !== v)
|
|
73
|
+
changed = true;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return changed ? out : node;
|
|
77
|
+
}
|
|
78
|
+
return node;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Create a processor that redacts sensitive data before formatting. It walks
|
|
82
|
+
* `context`, `metadata` and each element of `args`, replacing any value whose
|
|
83
|
+
* path matches one of `keys` with `replacement` (default `"[REDACTED]"`).
|
|
84
|
+
*
|
|
85
|
+
* Matching is **structural** — the original objects are never mutated; only the
|
|
86
|
+
* branches that actually contain a match are cloned. When nothing matches the
|
|
87
|
+
* entry is returned unchanged (same reference), so the common "no secret" case
|
|
88
|
+
* adds no allocation.
|
|
89
|
+
*
|
|
90
|
+
* @example
|
|
91
|
+
* createRedactProcessor(['password']) // any `password` at any depth
|
|
92
|
+
* createRedactProcessor(['user.password']) // only `user.password`
|
|
93
|
+
* createRedactProcessor(['*.token', 'user.*']) // wildcards
|
|
94
|
+
*/
|
|
95
|
+
/**
|
|
96
|
+
* Common secret / PII key names redacted by {@link createRedactProcessor} when
|
|
97
|
+
* no explicit key list is supplied. Covers passwords, tokens, API keys, auth
|
|
98
|
+
* headers, cookies, private keys and a few PII fields.
|
|
99
|
+
*/
|
|
100
|
+
exports.DEFAULT_SENSITIVE_KEYS = [
|
|
101
|
+
'password',
|
|
102
|
+
'passwd',
|
|
103
|
+
'pwd',
|
|
104
|
+
'secret',
|
|
105
|
+
'token',
|
|
106
|
+
'accessToken',
|
|
107
|
+
'refreshToken',
|
|
108
|
+
'apiKey',
|
|
109
|
+
'api_key',
|
|
110
|
+
'authorization',
|
|
111
|
+
'auth',
|
|
112
|
+
'cookie',
|
|
113
|
+
'setCookie',
|
|
114
|
+
'set-cookie',
|
|
115
|
+
'privateKey',
|
|
116
|
+
'private_key',
|
|
117
|
+
'credentials',
|
|
118
|
+
'credential',
|
|
119
|
+
'sessionId',
|
|
120
|
+
'session',
|
|
121
|
+
'csrfToken',
|
|
122
|
+
'csrf',
|
|
123
|
+
'otp',
|
|
124
|
+
'ssn',
|
|
125
|
+
'x-api-key',
|
|
126
|
+
];
|
|
127
|
+
function createRedactProcessor(keys = exports.DEFAULT_SENSITIVE_KEYS, replacement = '[REDACTED]') {
|
|
128
|
+
if (keys.length === 0)
|
|
129
|
+
return exports.identityProcessor;
|
|
130
|
+
const matchers = keys.map(compileMatcher);
|
|
131
|
+
return (entry) => {
|
|
132
|
+
const context = redactNode(entry.context, [], matchers, replacement);
|
|
133
|
+
const metadata = redactNode(entry.metadata, [], matchers, replacement);
|
|
134
|
+
let argsChanged = false;
|
|
135
|
+
const args = entry.args.map((a) => {
|
|
136
|
+
const r = redactNode(a, [], matchers, replacement);
|
|
137
|
+
if (r !== a)
|
|
138
|
+
argsChanged = true;
|
|
139
|
+
return r;
|
|
140
|
+
});
|
|
141
|
+
if (context === entry.context && metadata === entry.metadata && !argsChanged) {
|
|
142
|
+
return entry;
|
|
143
|
+
}
|
|
144
|
+
return { ...entry, context, metadata, args: argsChanged ? args : entry.args };
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
function serializeNode(node, serializers, entry) {
|
|
148
|
+
if (Array.isArray(node)) {
|
|
149
|
+
let changed = false;
|
|
150
|
+
const out = new Array(node.length);
|
|
151
|
+
for (let i = 0; i < node.length; i++) {
|
|
152
|
+
const r = serializeNode(node[i], serializers, entry);
|
|
153
|
+
out[i] = r;
|
|
154
|
+
if (r !== node[i])
|
|
155
|
+
changed = true;
|
|
156
|
+
}
|
|
157
|
+
return changed ? out : node;
|
|
158
|
+
}
|
|
159
|
+
if (node !== null && typeof node === 'object') {
|
|
160
|
+
let changed = false;
|
|
161
|
+
const out = {};
|
|
162
|
+
for (const k of Object.keys(node)) {
|
|
163
|
+
const v = node[k];
|
|
164
|
+
if (serializers[k]) {
|
|
165
|
+
out[k] = serializers[k](v, entry);
|
|
166
|
+
changed = true;
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
const r = serializeNode(v, serializers, entry);
|
|
170
|
+
out[k] = r;
|
|
171
|
+
if (r !== v)
|
|
172
|
+
changed = true;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
return changed ? out : node;
|
|
176
|
+
}
|
|
177
|
+
return node;
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Create a processor that normalizes values by key name before formatting. For
|
|
181
|
+
* every property named `key` found in `context`, `metadata`, each element of
|
|
182
|
+
* `args` (and the entry's `error`), the matching serializer replaces the value.
|
|
183
|
+
* Matching is by property name at **any depth** (e.g. a `req` serializer runs on
|
|
184
|
+
* any object that has a `req` property).
|
|
185
|
+
*
|
|
186
|
+
* Transformation is **structural** — only the branches that contain a matching
|
|
187
|
+
* key are cloned; when no serializer fires the entry is returned unchanged (same
|
|
188
|
+
* reference), so the common "no serializer matched" case adds no allocation.
|
|
189
|
+
*
|
|
190
|
+
* @example
|
|
191
|
+
* createSerializeProcessor({
|
|
192
|
+
* err: (e) => ({ name: e.name, message: e.message, stack: e.stack }),
|
|
193
|
+
* user: (u) => ({ id: u.id }), // drop the rest of the user object
|
|
194
|
+
* })
|
|
195
|
+
*/
|
|
196
|
+
function createSerializeProcessor(serializers) {
|
|
197
|
+
if (!serializers || Object.keys(serializers).length === 0)
|
|
198
|
+
return exports.identityProcessor;
|
|
199
|
+
return (entry) => {
|
|
200
|
+
const context = serializeNode(entry.context, serializers, entry);
|
|
201
|
+
const metadata = serializeNode(entry.metadata, serializers, entry);
|
|
202
|
+
let argsChanged = false;
|
|
203
|
+
const args = entry.args.map((a) => {
|
|
204
|
+
const r = serializeNode(a, serializers, entry);
|
|
205
|
+
if (r !== a)
|
|
206
|
+
argsChanged = true;
|
|
207
|
+
return r;
|
|
208
|
+
});
|
|
209
|
+
let error = entry.error;
|
|
210
|
+
let errorChanged = false;
|
|
211
|
+
if (error !== undefined && serializers['error']) {
|
|
212
|
+
const r = serializers['error'](error, entry);
|
|
213
|
+
if (r !== error) {
|
|
214
|
+
error = r;
|
|
215
|
+
errorChanged = true;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
if (context === entry.context && metadata === entry.metadata && !argsChanged && !errorChanged) {
|
|
219
|
+
return entry;
|
|
220
|
+
}
|
|
221
|
+
return {
|
|
222
|
+
...entry,
|
|
223
|
+
context,
|
|
224
|
+
metadata,
|
|
225
|
+
args: argsChanged ? args : entry.args,
|
|
226
|
+
...(errorChanged ? { error } : {}),
|
|
227
|
+
};
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
function serializeErrorValue(v) {
|
|
231
|
+
return v instanceof Error ? { name: v.name, message: v.message, stack: v.stack } : v;
|
|
232
|
+
}
|
|
233
|
+
function serializeBufferValue(v) {
|
|
234
|
+
if (typeof Buffer !== 'undefined' && Buffer.isBuffer(v))
|
|
235
|
+
return `Buffer(${v.length})`;
|
|
236
|
+
if (v instanceof ArrayBuffer)
|
|
237
|
+
return `ArrayBuffer(${v.byteLength})`;
|
|
238
|
+
if (ArrayBuffer.isView(v)) {
|
|
239
|
+
return `${v.constructor.name}(${v.byteLength})`;
|
|
240
|
+
}
|
|
241
|
+
return v;
|
|
242
|
+
}
|
|
243
|
+
function serializeUrlValue(v) {
|
|
244
|
+
return v instanceof URL ? v.href : v;
|
|
245
|
+
}
|
|
246
|
+
function serializeDateValue(v) {
|
|
247
|
+
return v instanceof Date ? v.toISOString() : v;
|
|
248
|
+
}
|
|
249
|
+
function serializeRequestValue(v) {
|
|
250
|
+
if (!v || typeof v !== 'object')
|
|
251
|
+
return v;
|
|
252
|
+
const r = v;
|
|
253
|
+
if (!('method' in r) && !('url' in r))
|
|
254
|
+
return v;
|
|
255
|
+
return { method: r.method, url: r.url, headers: r.headers };
|
|
256
|
+
}
|
|
257
|
+
function serializeResponseValue(v) {
|
|
258
|
+
if (!v || typeof v !== 'object')
|
|
259
|
+
return v;
|
|
260
|
+
const r = v;
|
|
261
|
+
if (!('status' in r) && !('statusCode' in r))
|
|
262
|
+
return v;
|
|
263
|
+
return { status: r.status ?? r.statusCode, headers: r.headers };
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* A preset of common {@link Serializer}s keyed by the property names they match
|
|
267
|
+
* (`error`, `date`, `buffer`, `url`, `req`, `res`). Spread it into your own
|
|
268
|
+
* serializer map to get safe, compact representations of these types out of the
|
|
269
|
+
* box, e.g. `createSerializeProcessor({ ...createDefaultSerializers(), user })`.
|
|
270
|
+
*
|
|
271
|
+
* Matching is by property name at any depth (see {@link createSerializeProcessor}),
|
|
272
|
+
* so any object with a `req`/`res`/`url`/`error` property is normalized.
|
|
273
|
+
*/
|
|
274
|
+
function createDefaultSerializers() {
|
|
275
|
+
return {
|
|
276
|
+
error: serializeErrorValue,
|
|
277
|
+
date: serializeDateValue,
|
|
278
|
+
buffer: serializeBufferValue,
|
|
279
|
+
url: serializeUrlValue,
|
|
280
|
+
req: serializeRequestValue,
|
|
281
|
+
res: serializeResponseValue,
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
//# 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,62 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createSampler = createSampler;
|
|
4
|
+
/**
|
|
5
|
+
* Build a {@link Filter} that drops log entries to reduce volume. Two orthogonal
|
|
6
|
+
* strategies are supported and combined with a logical AND:
|
|
7
|
+
*
|
|
8
|
+
* - **probabilistic** (`rate`): keep each entry with probability `rate`;
|
|
9
|
+
* - **rate limiting** (`maxPerSecond` + `burst`): a token bucket caps throughput
|
|
10
|
+
* per second, tolerating short bursts.
|
|
11
|
+
*
|
|
12
|
+
* Entries outside `levels` are always kept. Because this is a filter, sampled
|
|
13
|
+
* entries never reach processors, formatters or transports — so sampling is also
|
|
14
|
+
* the cheapest way to cut cost under load.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```ts
|
|
18
|
+
* logger.getPipeline().addFilter(
|
|
19
|
+
* createSampler({ levels: ['debug', 'info'], maxPerSecond: 100, burst: 200 }),
|
|
20
|
+
* );
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
function createSampler(options = {}) {
|
|
24
|
+
const rate = options.rate ?? 1;
|
|
25
|
+
const levelSet = options.levels ? new Set(options.levels) : undefined;
|
|
26
|
+
const maxPerSecond = options.maxPerSecond;
|
|
27
|
+
const capacity = maxPerSecond !== undefined ? (options.burst ?? maxPerSecond) : 0;
|
|
28
|
+
// Token-bucket state for rate limiting; lazily initialized on first use.
|
|
29
|
+
let tokens = capacity;
|
|
30
|
+
let lastRefill = 0;
|
|
31
|
+
return (entry) => {
|
|
32
|
+
// Levels not opted into sampling always pass through.
|
|
33
|
+
if (levelSet && !levelSet.has(entry.levelName))
|
|
34
|
+
return true;
|
|
35
|
+
// Probabilistic sampling.
|
|
36
|
+
if (rate < 1 && Math.random() >= rate)
|
|
37
|
+
return false;
|
|
38
|
+
// Rate limiting (token bucket keyed on the entry's ms timestamp).
|
|
39
|
+
if (maxPerSecond !== undefined) {
|
|
40
|
+
const now = entry.timestamp;
|
|
41
|
+
if (lastRefill === 0) {
|
|
42
|
+
lastRefill = now;
|
|
43
|
+
tokens = capacity;
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
const elapsed = now - lastRefill;
|
|
47
|
+
if (elapsed > 0) {
|
|
48
|
+
tokens = Math.min(capacity, tokens + (elapsed * maxPerSecond) / 1000);
|
|
49
|
+
lastRefill = now;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
if (tokens >= 1) {
|
|
53
|
+
tokens -= 1;
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return true;
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=sampler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sampler.js","sourceRoot":"","sources":["../../../src/pipeline/sampler.ts"],"names":[],"mappings":";;AA6CA,sCAuCC;AA1DD;;;;;;;;;;;;;;;;;;GAkBG;AACH,SAAgB,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,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./plugin.js"), exports);
|
|
18
|
+
__exportStar(require("./manager.js"), exports);
|
|
19
|
+
__exportStar(require("./otel-trace.js"), exports);
|
|
20
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/plugin/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,8CAA4B;AAC5B,+CAA6B;AAC7B,kDAAgC"}
|