@vibesdotdev/logging 0.0.1
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/README.md +80 -0
- package/SPEC.md +65 -0
- package/dist/audit/audit.descriptor.d.ts +11 -0
- package/dist/audit/audit.descriptor.d.ts.map +1 -0
- package/dist/audit/audit.descriptor.js +40 -0
- package/dist/audit/audit.descriptor.js.map +1 -0
- package/dist/audit/audit.storage.schema.d.ts +79 -0
- package/dist/audit/audit.storage.schema.d.ts.map +1 -0
- package/dist/audit/audit.storage.schema.js +33 -0
- package/dist/audit/audit.storage.schema.js.map +1 -0
- package/dist/audit/index.d.ts +2 -0
- package/dist/audit/index.d.ts.map +1 -0
- package/dist/audit/index.js +2 -0
- package/dist/audit/index.js.map +1 -0
- package/dist/cli/logs.descriptor.d.ts +9 -0
- package/dist/cli/logs.descriptor.d.ts.map +1 -0
- package/dist/cli/logs.descriptor.js +16 -0
- package/dist/cli/logs.descriptor.js.map +1 -0
- package/dist/cli/logs.list.descriptor.d.ts +9 -0
- package/dist/cli/logs.list.descriptor.d.ts.map +1 -0
- package/dist/cli/logs.list.descriptor.js +23 -0
- package/dist/cli/logs.list.descriptor.js.map +1 -0
- package/dist/cli/logs.list.impl.d.ts +13 -0
- package/dist/cli/logs.list.impl.d.ts.map +1 -0
- package/dist/cli/logs.list.impl.js +81 -0
- package/dist/cli/logs.list.impl.js.map +1 -0
- package/dist/cli/logs.rotate.descriptor.d.ts +9 -0
- package/dist/cli/logs.rotate.descriptor.d.ts.map +1 -0
- package/dist/cli/logs.rotate.descriptor.js +34 -0
- package/dist/cli/logs.rotate.descriptor.js.map +1 -0
- package/dist/cli/logs.rotate.impl.d.ts +17 -0
- package/dist/cli/logs.rotate.impl.d.ts.map +1 -0
- package/dist/cli/logs.rotate.impl.js +48 -0
- package/dist/cli/logs.rotate.impl.js.map +1 -0
- package/dist/cli/logs.search.descriptor.d.ts +9 -0
- package/dist/cli/logs.search.descriptor.d.ts.map +1 -0
- package/dist/cli/logs.search.descriptor.js +55 -0
- package/dist/cli/logs.search.descriptor.js.map +1 -0
- package/dist/cli/logs.search.impl.d.ts +22 -0
- package/dist/cli/logs.search.impl.d.ts.map +1 -0
- package/dist/cli/logs.search.impl.js +145 -0
- package/dist/cli/logs.search.impl.js.map +1 -0
- package/dist/cli/logs.tail.descriptor.d.ts +9 -0
- package/dist/cli/logs.tail.descriptor.d.ts.map +1 -0
- package/dist/cli/logs.tail.descriptor.js +43 -0
- package/dist/cli/logs.tail.descriptor.js.map +1 -0
- package/dist/cli/logs.tail.impl.d.ts +19 -0
- package/dist/cli/logs.tail.impl.d.ts.map +1 -0
- package/dist/cli/logs.tail.impl.js +78 -0
- package/dist/cli/logs.tail.impl.js.map +1 -0
- package/dist/cli/logs.view.descriptor.d.ts +9 -0
- package/dist/cli/logs.view.descriptor.d.ts.map +1 -0
- package/dist/cli/logs.view.descriptor.js +51 -0
- package/dist/cli/logs.view.descriptor.js.map +1 -0
- package/dist/cli/logs.view.impl.d.ts +21 -0
- package/dist/cli/logs.view.impl.d.ts.map +1 -0
- package/dist/cli/logs.view.impl.js +85 -0
- package/dist/cli/logs.view.impl.js.map +1 -0
- package/dist/cli/types.d.ts +57 -0
- package/dist/cli/types.d.ts.map +1 -0
- package/dist/cli/types.js +9 -0
- package/dist/cli/types.js.map +1 -0
- package/dist/contexts/audit.d.ts +34 -0
- package/dist/contexts/audit.d.ts.map +1 -0
- package/dist/contexts/audit.js +13 -0
- package/dist/contexts/audit.js.map +1 -0
- package/dist/contexts/fallback-logger.d.ts +3 -0
- package/dist/contexts/fallback-logger.d.ts.map +1 -0
- package/dist/contexts/fallback-logger.js +67 -0
- package/dist/contexts/fallback-logger.js.map +1 -0
- package/dist/contexts/index.d.ts +8 -0
- package/dist/contexts/index.d.ts.map +1 -0
- package/dist/contexts/index.js +9 -0
- package/dist/contexts/index.js.map +1 -0
- package/dist/contexts/logger.d.ts +26 -0
- package/dist/contexts/logger.d.ts.map +1 -0
- package/dist/contexts/logger.js +88 -0
- package/dist/contexts/logger.js.map +1 -0
- package/dist/core/index.d.ts +9 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +10 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/logger.d.ts +3 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +118 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/namespace.d.ts +69 -0
- package/dist/core/namespace.d.ts.map +1 -0
- package/dist/core/namespace.js +136 -0
- package/dist/core/namespace.js.map +1 -0
- package/dist/core/parsing.d.ts +3 -0
- package/dist/core/parsing.d.ts.map +1 -0
- package/dist/core/parsing.js +25 -0
- package/dist/core/parsing.js.map +1 -0
- package/dist/core/types.d.ts +69 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +7 -0
- package/dist/core/types.js.map +1 -0
- package/dist/docs/levels.docs.descriptor.d.ts +4 -0
- package/dist/docs/levels.docs.descriptor.d.ts.map +1 -0
- package/dist/docs/levels.docs.descriptor.js +342 -0
- package/dist/docs/levels.docs.descriptor.js.map +1 -0
- package/dist/docs/structured.docs.descriptor.d.ts +4 -0
- package/dist/docs/structured.docs.descriptor.d.ts.map +1 -0
- package/dist/docs/structured.docs.descriptor.js +442 -0
- package/dist/docs/structured.docs.descriptor.js.map +1 -0
- package/dist/docs/transports.docs.descriptor.d.ts +4 -0
- package/dist/docs/transports.docs.descriptor.d.ts.map +1 -0
- package/dist/docs/transports.docs.descriptor.js +426 -0
- package/dist/docs/transports.docs.descriptor.js.map +1 -0
- package/dist/formatters/index.d.ts +7 -0
- package/dist/formatters/index.d.ts.map +1 -0
- package/dist/formatters/index.js +8 -0
- package/dist/formatters/index.js.map +1 -0
- package/dist/formatters/json/json.formatters.descriptor.d.ts +9 -0
- package/dist/formatters/json/json.formatters.descriptor.d.ts.map +1 -0
- package/dist/formatters/json/json.formatters.descriptor.js +22 -0
- package/dist/formatters/json/json.formatters.descriptor.js.map +1 -0
- package/dist/formatters/json/json.impl.d.ts +22 -0
- package/dist/formatters/json/json.impl.d.ts.map +1 -0
- package/dist/formatters/json/json.impl.js +32 -0
- package/dist/formatters/json/json.impl.js.map +1 -0
- package/dist/formatters/json5/json5.descriptor.d.ts +9 -0
- package/dist/formatters/json5/json5.descriptor.d.ts.map +1 -0
- package/dist/formatters/json5/json5.descriptor.js +22 -0
- package/dist/formatters/json5/json5.descriptor.js.map +1 -0
- package/dist/formatters/json5/json5.impl.d.ts +23 -0
- package/dist/formatters/json5/json5.impl.d.ts.map +1 -0
- package/dist/formatters/json5/json5.impl.js +34 -0
- package/dist/formatters/json5/json5.impl.js.map +1 -0
- package/dist/formatters/jsonl/jsonl.descriptor.d.ts +10 -0
- package/dist/formatters/jsonl/jsonl.descriptor.d.ts.map +1 -0
- package/dist/formatters/jsonl/jsonl.descriptor.js +23 -0
- package/dist/formatters/jsonl/jsonl.descriptor.js.map +1 -0
- package/dist/formatters/jsonl/jsonl.impl.d.ts +21 -0
- package/dist/formatters/jsonl/jsonl.impl.d.ts.map +1 -0
- package/dist/formatters/jsonl/jsonl.impl.js +30 -0
- package/dist/formatters/jsonl/jsonl.impl.js.map +1 -0
- package/dist/formatters/pretty/pretty.descriptor.d.ts +9 -0
- package/dist/formatters/pretty/pretty.descriptor.d.ts.map +1 -0
- package/dist/formatters/pretty/pretty.descriptor.js +23 -0
- package/dist/formatters/pretty/pretty.descriptor.js.map +1 -0
- package/dist/formatters/pretty/pretty.impl.cli.d.ts +23 -0
- package/dist/formatters/pretty/pretty.impl.cli.d.ts.map +1 -0
- package/dist/formatters/pretty/pretty.impl.cli.js +81 -0
- package/dist/formatters/pretty/pretty.impl.cli.js.map +1 -0
- package/dist/index.d.ts +67 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +97 -0
- package/dist/index.js.map +1 -0
- package/dist/kinds/audit.d.ts +85 -0
- package/dist/kinds/audit.d.ts.map +1 -0
- package/dist/kinds/audit.js +71 -0
- package/dist/kinds/audit.js.map +1 -0
- package/dist/kinds/contexts.d.ts +21 -0
- package/dist/kinds/contexts.d.ts.map +1 -0
- package/dist/kinds/contexts.js +8 -0
- package/dist/kinds/contexts.js.map +1 -0
- package/dist/kinds/formatter.d.ts +42 -0
- package/dist/kinds/formatter.d.ts.map +1 -0
- package/dist/kinds/formatter.js +69 -0
- package/dist/kinds/formatter.js.map +1 -0
- package/dist/kinds/index.d.ts +13 -0
- package/dist/kinds/index.d.ts.map +1 -0
- package/dist/kinds/index.js +13 -0
- package/dist/kinds/index.js.map +1 -0
- package/dist/kinds/logger.contracts.d.ts +16 -0
- package/dist/kinds/logger.contracts.d.ts.map +1 -0
- package/dist/kinds/logger.contracts.js +9 -0
- package/dist/kinds/logger.contracts.js.map +1 -0
- package/dist/kinds/logger.d.ts +15 -0
- package/dist/kinds/logger.d.ts.map +1 -0
- package/dist/kinds/logger.impl.d.ts +40 -0
- package/dist/kinds/logger.impl.d.ts.map +1 -0
- package/dist/kinds/logger.impl.js +139 -0
- package/dist/kinds/logger.impl.js.map +1 -0
- package/dist/kinds/logger.js +28 -0
- package/dist/kinds/logger.js.map +1 -0
- package/dist/kinds/logger.utils.d.ts +15 -0
- package/dist/kinds/logger.utils.d.ts.map +1 -0
- package/dist/kinds/logger.utils.js +55 -0
- package/dist/kinds/logger.utils.js.map +1 -0
- package/dist/kinds/output.contracts.d.ts +50 -0
- package/dist/kinds/output.contracts.d.ts.map +1 -0
- package/dist/kinds/output.contracts.js +10 -0
- package/dist/kinds/output.contracts.js.map +1 -0
- package/dist/kinds/output.d.ts +20 -0
- package/dist/kinds/output.d.ts.map +1 -0
- package/dist/kinds/output.impl.d.ts +22 -0
- package/dist/kinds/output.impl.d.ts.map +1 -0
- package/dist/kinds/output.impl.js +84 -0
- package/dist/kinds/output.impl.js.map +1 -0
- package/dist/kinds/output.js +29 -0
- package/dist/kinds/output.js.map +1 -0
- package/dist/kinds/output.types.d.ts +92 -0
- package/dist/kinds/output.types.d.ts.map +1 -0
- package/dist/kinds/output.types.js +7 -0
- package/dist/kinds/output.types.js.map +1 -0
- package/dist/kinds/sink.d.ts +40 -0
- package/dist/kinds/sink.d.ts.map +1 -0
- package/dist/kinds/sink.js +61 -0
- package/dist/kinds/sink.js.map +1 -0
- package/dist/logger.context.descriptor.d.ts +21 -0
- package/dist/logger.context.descriptor.d.ts.map +1 -0
- package/dist/logger.context.descriptor.js +12 -0
- package/dist/logger.context.descriptor.js.map +1 -0
- package/dist/logging.cli.plugin.d.ts +20 -0
- package/dist/logging.cli.plugin.d.ts.map +1 -0
- package/dist/logging.cli.plugin.js +39 -0
- package/dist/logging.cli.plugin.js.map +1 -0
- package/dist/logging.plugin.d.ts +16 -0
- package/dist/logging.plugin.d.ts.map +1 -0
- package/dist/logging.plugin.js +83 -0
- package/dist/logging.plugin.js.map +1 -0
- package/dist/outputs/index.d.ts +7 -0
- package/dist/outputs/index.d.ts.map +1 -0
- package/dist/outputs/index.js +8 -0
- package/dist/outputs/index.js.map +1 -0
- package/dist/outputs/remote/remote.descriptor.d.ts +10 -0
- package/dist/outputs/remote/remote.descriptor.d.ts.map +1 -0
- package/dist/outputs/remote/remote.descriptor.js +24 -0
- package/dist/outputs/remote/remote.descriptor.js.map +1 -0
- package/dist/outputs/remote/remote.impl.d.ts +50 -0
- package/dist/outputs/remote/remote.impl.d.ts.map +1 -0
- package/dist/outputs/remote/remote.impl.js +178 -0
- package/dist/outputs/remote/remote.impl.js.map +1 -0
- package/dist/outputs.context.descriptor.d.ts +19 -0
- package/dist/outputs.context.descriptor.d.ts.map +1 -0
- package/dist/outputs.context.descriptor.js +9 -0
- package/dist/outputs.context.descriptor.js.map +1 -0
- package/dist/outputs.context.impl.d.ts +9 -0
- package/dist/outputs.context.impl.d.ts.map +1 -0
- package/dist/outputs.context.impl.js +18 -0
- package/dist/outputs.context.impl.js.map +1 -0
- package/dist/paths.d.ts +8 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +10 -0
- package/dist/paths.js.map +1 -0
- package/dist/schemas/audit.d.ts +133 -0
- package/dist/schemas/audit.d.ts.map +1 -0
- package/dist/schemas/audit.js +80 -0
- package/dist/schemas/audit.js.map +1 -0
- package/dist/schemas/entry.d.ts +74 -0
- package/dist/schemas/entry.d.ts.map +1 -0
- package/dist/schemas/entry.js +62 -0
- package/dist/schemas/entry.js.map +1 -0
- package/dist/schemas/formatter.d.ts +46 -0
- package/dist/schemas/formatter.d.ts.map +1 -0
- package/dist/schemas/formatter.js +31 -0
- package/dist/schemas/formatter.js.map +1 -0
- package/dist/schemas/index.d.ts +12 -0
- package/dist/schemas/index.d.ts.map +1 -0
- package/dist/schemas/index.js +18 -0
- package/dist/schemas/index.js.map +1 -0
- package/dist/schemas/logger.d.ts +48 -0
- package/dist/schemas/logger.d.ts.map +1 -0
- package/dist/schemas/logger.js +27 -0
- package/dist/schemas/logger.js.map +1 -0
- package/dist/schemas/output.d.ts +68 -0
- package/dist/schemas/output.d.ts.map +1 -0
- package/dist/schemas/output.js +48 -0
- package/dist/schemas/output.js.map +1 -0
- package/dist/schemas/sink.d.ts +52 -0
- package/dist/schemas/sink.d.ts.map +1 -0
- package/dist/schemas/sink.js +30 -0
- package/dist/schemas/sink.js.map +1 -0
- package/dist/sinks/buffer/buffer.descriptor.d.ts +4 -0
- package/dist/sinks/buffer/buffer.descriptor.d.ts.map +1 -0
- package/dist/sinks/buffer/buffer.descriptor.js +11 -0
- package/dist/sinks/buffer/buffer.descriptor.js.map +1 -0
- package/dist/sinks/buffer/buffer.impl.cli.d.ts +21 -0
- package/dist/sinks/buffer/buffer.impl.cli.d.ts.map +1 -0
- package/dist/sinks/buffer/buffer.impl.cli.js +34 -0
- package/dist/sinks/buffer/buffer.impl.cli.js.map +1 -0
- package/dist/sinks/console/console.descriptor.d.ts +10 -0
- package/dist/sinks/console/console.descriptor.d.ts.map +1 -0
- package/dist/sinks/console/console.descriptor.js +17 -0
- package/dist/sinks/console/console.descriptor.js.map +1 -0
- package/dist/sinks/console/console.impl.browser.d.ts +21 -0
- package/dist/sinks/console/console.impl.browser.d.ts.map +1 -0
- package/dist/sinks/console/console.impl.browser.js +57 -0
- package/dist/sinks/console/console.impl.browser.js.map +1 -0
- package/dist/sinks/console/console.impl.cli.d.ts +21 -0
- package/dist/sinks/console/console.impl.cli.d.ts.map +1 -0
- package/dist/sinks/console/console.impl.cli.js +57 -0
- package/dist/sinks/console/console.impl.cli.js.map +1 -0
- package/dist/sinks/index.d.ts +8 -0
- package/dist/sinks/index.d.ts.map +1 -0
- package/dist/sinks/index.js +8 -0
- package/dist/sinks/index.js.map +1 -0
- package/dist/sinks/memory/memory.descriptor.d.ts +10 -0
- package/dist/sinks/memory/memory.descriptor.d.ts.map +1 -0
- package/dist/sinks/memory/memory.descriptor.js +17 -0
- package/dist/sinks/memory/memory.descriptor.js.map +1 -0
- package/dist/sinks/memory/memory.impl.d.ts +50 -0
- package/dist/sinks/memory/memory.impl.d.ts.map +1 -0
- package/dist/sinks/memory/memory.impl.js +88 -0
- package/dist/sinks/memory/memory.impl.js.map +1 -0
- package/dist/sinks/stdout/stdout.descriptor.d.ts +4 -0
- package/dist/sinks/stdout/stdout.descriptor.d.ts.map +1 -0
- package/dist/sinks/stdout/stdout.descriptor.js +11 -0
- package/dist/sinks/stdout/stdout.descriptor.js.map +1 -0
- package/dist/sinks/stdout/stdout.impl.cli.d.ts +10 -0
- package/dist/sinks/stdout/stdout.impl.cli.d.ts.map +1 -0
- package/dist/sinks/stdout/stdout.impl.cli.js +21 -0
- package/dist/sinks/stdout/stdout.impl.cli.js.map +1 -0
- package/dist/sinks.context.descriptor.d.ts +19 -0
- package/dist/sinks.context.descriptor.d.ts.map +1 -0
- package/dist/sinks.context.descriptor.js +9 -0
- package/dist/sinks.context.descriptor.js.map +1 -0
- package/dist/sinks.context.impl.d.ts +9 -0
- package/dist/sinks.context.impl.d.ts.map +1 -0
- package/dist/sinks.context.impl.js +18 -0
- package/dist/sinks.context.impl.js.map +1 -0
- package/package.json +331 -0
- package/src/audit/audit.descriptor.ts +45 -0
- package/src/audit/audit.storage.schema.ts +57 -0
- package/src/audit/index.ts +8 -0
- package/src/cli/logs.descriptor.ts +19 -0
- package/src/cli/logs.list.descriptor.ts +28 -0
- package/src/cli/logs.list.impl.ts +93 -0
- package/src/cli/logs.rotate.descriptor.ts +40 -0
- package/src/cli/logs.rotate.impl.ts +61 -0
- package/src/cli/logs.search.descriptor.ts +61 -0
- package/src/cli/logs.search.impl.ts +173 -0
- package/src/cli/logs.tail.descriptor.ts +49 -0
- package/src/cli/logs.tail.impl.ts +105 -0
- package/src/cli/logs.view.descriptor.ts +57 -0
- package/src/cli/logs.view.impl.ts +108 -0
- package/src/cli/types.ts +59 -0
- package/src/contexts/audit.ts +36 -0
- package/src/contexts/fallback-logger.ts +80 -0
- package/src/contexts/index.ts +23 -0
- package/src/contexts/logger.ts +119 -0
- package/src/core/index.ts +32 -0
- package/src/core/logger.ts +150 -0
- package/src/core/namespace.ts +195 -0
- package/src/core/parsing.ts +21 -0
- package/src/core/types.ts +82 -0
- package/src/docs/levels.docs.descriptor.ts +344 -0
- package/src/docs/structured.docs.descriptor.ts +444 -0
- package/src/docs/transports.docs.descriptor.ts +428 -0
- package/src/formatters/index.ts +6 -0
- package/src/formatters/json/json.formatters.descriptor.ts +25 -0
- package/src/formatters/json/json.impl.ts +41 -0
- package/src/formatters/json5/json5.descriptor.ts +25 -0
- package/src/formatters/json5/json5.impl.ts +43 -0
- package/src/formatters/jsonl/jsonl.descriptor.ts +26 -0
- package/src/formatters/jsonl/jsonl.impl.ts +39 -0
- package/src/formatters/pretty/pretty.descriptor.ts +26 -0
- package/src/formatters/pretty/pretty.impl.cli.ts +101 -0
- package/src/index.ts +190 -0
- package/src/kinds/audit.ts +169 -0
- package/src/kinds/contexts.ts +22 -0
- package/src/kinds/formatter.ts +117 -0
- package/src/kinds/index.ts +25 -0
- package/src/kinds/logger.contracts.ts +17 -0
- package/src/kinds/logger.impl.ts +206 -0
- package/src/kinds/logger.ts +46 -0
- package/src/kinds/logger.utils.ts +91 -0
- package/src/kinds/output.contracts.ts +54 -0
- package/src/kinds/output.impl.ts +118 -0
- package/src/kinds/output.ts +59 -0
- package/src/kinds/output.types.ts +105 -0
- package/src/kinds/sink.ts +100 -0
- package/src/logger.context.descriptor.ts +13 -0
- package/src/logging.cli.plugin.ts +43 -0
- package/src/logging.plugin.ts +93 -0
- package/src/outputs/index.ts +6 -0
- package/src/outputs/remote/remote.descriptor.ts +27 -0
- package/src/outputs/remote/remote.impl.ts +218 -0
- package/src/outputs.context.descriptor.ts +10 -0
- package/src/outputs.context.impl.ts +30 -0
- package/src/paths.ts +10 -0
- package/src/schemas/audit.ts +98 -0
- package/src/schemas/entry.ts +88 -0
- package/src/schemas/formatter.ts +37 -0
- package/src/schemas/index.ts +80 -0
- package/src/schemas/logger.ts +38 -0
- package/src/schemas/output.ts +62 -0
- package/src/schemas/sink.ts +39 -0
- package/src/sinks/buffer/buffer.descriptor.ts +13 -0
- package/src/sinks/buffer/buffer.impl.cli.ts +49 -0
- package/src/sinks/console/console.descriptor.ts +20 -0
- package/src/sinks/console/console.impl.browser.ts +69 -0
- package/src/sinks/console/console.impl.cli.ts +71 -0
- package/src/sinks/index.ts +8 -0
- package/src/sinks/memory/memory.descriptor.ts +20 -0
- package/src/sinks/memory/memory.impl.ts +119 -0
- package/src/sinks/stdout/stdout.descriptor.ts +13 -0
- package/src/sinks/stdout/stdout.impl.cli.ts +27 -0
- package/src/sinks.context.descriptor.ts +10 -0
- package/src/sinks.context.impl.ts +30 -0
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import type { LoggerImplementation } from '../kinds/logger.impl';
|
|
2
|
+
import type { LogLevel, LogContext, LoggerChildOptions, PerformanceTrackerParams } from '../schemas/entry.ts';
|
|
3
|
+
import type { PerformanceTracker } from '../schemas/entry.ts';
|
|
4
|
+
|
|
5
|
+
function createFallbackLoggerInternal(
|
|
6
|
+
namespace: string,
|
|
7
|
+
baseContext: LogContext
|
|
8
|
+
): LoggerImplementation {
|
|
9
|
+
const normalizeLogContext = (context: unknown): LogContext => {
|
|
10
|
+
if (context === undefined || context === null) {
|
|
11
|
+
return {};
|
|
12
|
+
}
|
|
13
|
+
if (context instanceof Error) {
|
|
14
|
+
return {
|
|
15
|
+
errorName: context.name,
|
|
16
|
+
errorMessage: context.message,
|
|
17
|
+
stack: context.stack
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
if (typeof context === 'object' && !Array.isArray(context)) {
|
|
21
|
+
return context as LogContext;
|
|
22
|
+
}
|
|
23
|
+
return { value: context };
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
const emit = (level: LogLevel, message: string, context?: unknown) => {
|
|
27
|
+
if (level === 'debug') return;
|
|
28
|
+
const prefix = `[${namespace}]`;
|
|
29
|
+
const merged = { ...baseContext, ...normalizeLogContext(context) };
|
|
30
|
+
const payloadStr =
|
|
31
|
+
Object.keys(merged).length > 0 ? ` ${JSON.stringify(merged)}` : '';
|
|
32
|
+
const line = `${prefix} ${message}${payloadStr}`;
|
|
33
|
+
console.error(line);
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
return {
|
|
37
|
+
namespace,
|
|
38
|
+
fullNamespace: namespace,
|
|
39
|
+
debug: (msg, ctx) => emit('debug', msg, ctx),
|
|
40
|
+
info: (msg, ctx) => emit('info', msg, ctx),
|
|
41
|
+
warn: (msg, ctx) => emit('warn', msg, ctx),
|
|
42
|
+
error: (msg, ctx) => emit('error', msg, ctx),
|
|
43
|
+
child: (options: LoggerChildOptions) => {
|
|
44
|
+
const childNs =
|
|
45
|
+
typeof options === 'string'
|
|
46
|
+
? `${namespace}:${options}`
|
|
47
|
+
: `${namespace}:${options.namespace ?? options.context ?? ''}`;
|
|
48
|
+
return createFallbackLoggerInternal(childNs, baseContext);
|
|
49
|
+
},
|
|
50
|
+
withContext: (ctx: LogContext) =>
|
|
51
|
+
createFallbackLoggerInternal(namespace, { ...baseContext, ...ctx }),
|
|
52
|
+
withRequestContext: (ctx) =>
|
|
53
|
+
createFallbackLoggerInternal(namespace, { ...baseContext, ...ctx }),
|
|
54
|
+
withJobContext: (ctx) =>
|
|
55
|
+
createFallbackLoggerInternal(namespace, { ...baseContext, ...ctx }),
|
|
56
|
+
performanceTracker: (params: PerformanceTrackerParams): PerformanceTracker => {
|
|
57
|
+
let startTime = 0;
|
|
58
|
+
const tracker = createFallbackLoggerInternal(namespace, {
|
|
59
|
+
...baseContext,
|
|
60
|
+
operation: params.operation,
|
|
61
|
+
...params.metadata
|
|
62
|
+
});
|
|
63
|
+
return {
|
|
64
|
+
start() { startTime = Date.now(); tracker.debug(`operation.${params.operation}.start`); },
|
|
65
|
+
end(successContext?: LogContext) {
|
|
66
|
+
const duration = Date.now() - startTime;
|
|
67
|
+
tracker.info(`operation.${params.operation}.success`, { duration, ...successContext });
|
|
68
|
+
},
|
|
69
|
+
fail(error: unknown, errorContext?: LogContext) {
|
|
70
|
+
const duration = Date.now() - startTime;
|
|
71
|
+
tracker.error(`operation.${params.operation}.failure`, { duration, error, ...errorContext });
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export function createFallbackLogger(namespace: string): LoggerImplementation {
|
|
79
|
+
return createFallbackLoggerInternal(namespace, {});
|
|
80
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Logging Contexts
|
|
3
|
+
*
|
|
4
|
+
* Context providers for dependency injection.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
export {
|
|
8
|
+
configureLoggerContext,
|
|
9
|
+
getLoggerContextConfig,
|
|
10
|
+
createLoggerContextProvider,
|
|
11
|
+
getLoggerContext,
|
|
12
|
+
setLoggerContext,
|
|
13
|
+
getLogger,
|
|
14
|
+
getDefaultLogger,
|
|
15
|
+
registerLogger,
|
|
16
|
+
initializeLoggers,
|
|
17
|
+
type LoggerContextConfig,
|
|
18
|
+
type LoggerContextProvider,
|
|
19
|
+
type RuntimeLogger
|
|
20
|
+
} from './logger.ts';
|
|
21
|
+
|
|
22
|
+
// Audit context types only — use runtime to resolve audit implementations
|
|
23
|
+
export { type AuditContextConfig, type AuditContextProvider } from './audit.ts';
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Logger Context Provider
|
|
3
|
+
*
|
|
4
|
+
* Provides logger instances to runtime assets via context injection.
|
|
5
|
+
* Loggers are resolved from the runtime and cached for sync access.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type { LoggerImplementation } from '../kinds/logger.impl';
|
|
9
|
+
import { createFallbackLogger } from './fallback-logger.ts';
|
|
10
|
+
|
|
11
|
+
export type RuntimeLogger = LoggerImplementation;
|
|
12
|
+
|
|
13
|
+
export interface LoggerContextConfig {
|
|
14
|
+
defaultNamespace: string;
|
|
15
|
+
defaultRuntime: 'server' | 'cli' | 'worker' | 'browser' | 'mcp';
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
const defaultConfig: LoggerContextConfig = {
|
|
19
|
+
defaultNamespace: 'vibes',
|
|
20
|
+
defaultRuntime: 'server'
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
let activeConfig = { ...defaultConfig };
|
|
24
|
+
|
|
25
|
+
export function configureLoggerContext(config: Partial<LoggerContextConfig>): void {
|
|
26
|
+
activeConfig = { ...activeConfig, ...config };
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export function getLoggerContextConfig(): LoggerContextConfig {
|
|
30
|
+
return { ...activeConfig };
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const loggerCache = new Map<string, LoggerImplementation>();
|
|
34
|
+
|
|
35
|
+
export function registerLogger(id: string, logger: LoggerImplementation): void {
|
|
36
|
+
loggerCache.set(id, logger);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export async function initializeLoggers(): Promise<void> {
|
|
40
|
+
try {
|
|
41
|
+
const { getVibesRuntime } = await import('@vibesdotdev/runtime');
|
|
42
|
+
const runtime = getVibesRuntime();
|
|
43
|
+
const loggerIds = runtime.query('logging/logger').ids();
|
|
44
|
+
const errors: Array<{ id: string; error: unknown }> = [];
|
|
45
|
+
|
|
46
|
+
for (const id of loggerIds) {
|
|
47
|
+
try {
|
|
48
|
+
const logger = (await runtime.query('logging/logger').withId(id).resolve()) as LoggerImplementation;
|
|
49
|
+
loggerCache.set(id, logger);
|
|
50
|
+
} catch (error) {
|
|
51
|
+
// Collect errors for reporting but continue initializing other loggers
|
|
52
|
+
errors.push({ id, error });
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// Log summary of initialization results
|
|
57
|
+
if (errors.length > 0) {
|
|
58
|
+
const fallbackLogger = createFallbackLogger('logging');
|
|
59
|
+
fallbackLogger.warn(`Failed to initialize ${errors.length} logger(s):`, {
|
|
60
|
+
loggerIds: errors.map((e) => e.id),
|
|
61
|
+
errors: errors.map((e) =>
|
|
62
|
+
e.error instanceof Error ? e.error.message : String(e.error)
|
|
63
|
+
)
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
} catch (error) {
|
|
67
|
+
// Runtime not available - this is expected in some contexts, use fallback
|
|
68
|
+
const fallbackLogger = createFallbackLogger('logging');
|
|
69
|
+
fallbackLogger.debug('Runtime not available for logger initialization, using fallback loggers', {
|
|
70
|
+
error: error instanceof Error ? error.message : String(error)
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export interface LoggerContextProvider {
|
|
76
|
+
getLogger(id: string): LoggerImplementation;
|
|
77
|
+
getDefaultLogger(): LoggerImplementation;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export function createLoggerContextProvider(
|
|
81
|
+
config?: Partial<LoggerContextConfig>
|
|
82
|
+
): LoggerContextProvider {
|
|
83
|
+
const mergedConfig = { ...activeConfig, ...config };
|
|
84
|
+
|
|
85
|
+
return {
|
|
86
|
+
getLogger(id: string): LoggerImplementation {
|
|
87
|
+
let logger = loggerCache.get(id);
|
|
88
|
+
if (logger) return logger;
|
|
89
|
+
logger = createFallbackLogger(id);
|
|
90
|
+
loggerCache.set(id, logger);
|
|
91
|
+
return logger;
|
|
92
|
+
},
|
|
93
|
+
|
|
94
|
+
getDefaultLogger(): LoggerImplementation {
|
|
95
|
+
return this.getLogger(mergedConfig.defaultNamespace);
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
let globalLoggerContext: LoggerContextProvider | null = null;
|
|
101
|
+
|
|
102
|
+
export function getLoggerContext(): LoggerContextProvider {
|
|
103
|
+
if (!globalLoggerContext) {
|
|
104
|
+
globalLoggerContext = createLoggerContextProvider();
|
|
105
|
+
}
|
|
106
|
+
return globalLoggerContext;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
export function setLoggerContext(provider: LoggerContextProvider): void {
|
|
110
|
+
globalLoggerContext = provider;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
export function getLogger(id: string): LoggerImplementation {
|
|
114
|
+
return getLoggerContext().getLogger(id);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
export function getDefaultLogger(): LoggerImplementation {
|
|
118
|
+
return getLoggerContext().getDefaultLogger();
|
|
119
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core Logging
|
|
3
|
+
*
|
|
4
|
+
* Exports logger factory and types.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
// Logger factory
|
|
8
|
+
export { createRuntimeLogger } from './logger.ts';
|
|
9
|
+
|
|
10
|
+
// Types
|
|
11
|
+
export type {
|
|
12
|
+
Logger,
|
|
13
|
+
RuntimeLogger,
|
|
14
|
+
Runtime,
|
|
15
|
+
RuntimeLoggerOptions,
|
|
16
|
+
RuntimeLoggerConfig
|
|
17
|
+
} from './types.ts';
|
|
18
|
+
|
|
19
|
+
// Namespace utilities
|
|
20
|
+
export {
|
|
21
|
+
parseNamespaceSettings,
|
|
22
|
+
parseNamespaceSettingsFromEnv,
|
|
23
|
+
matchesSelector,
|
|
24
|
+
isNamespaceIncluded,
|
|
25
|
+
shouldLog,
|
|
26
|
+
updateNamespaceSettings,
|
|
27
|
+
getNamespaceSettings,
|
|
28
|
+
defaultNamespaceSettings,
|
|
29
|
+
type NamespaceSelector,
|
|
30
|
+
type NamespaceSelectors,
|
|
31
|
+
type NamespaceSettings
|
|
32
|
+
} from './namespace.ts';
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import type { SinkImplementation } from '../kinds/sink.ts';
|
|
2
|
+
import type { RuntimeLogger, RuntimeLoggerOptions, RuntimeLoggerConfig } from './types.ts';
|
|
3
|
+
import type {
|
|
4
|
+
LogLevel,
|
|
5
|
+
LogContext,
|
|
6
|
+
RuntimeLogEntry,
|
|
7
|
+
LoggerChildOptions,
|
|
8
|
+
RequestLogContext,
|
|
9
|
+
JobLogContext,
|
|
10
|
+
PerformanceTracker,
|
|
11
|
+
PerformanceTrackerParams
|
|
12
|
+
} from '../schemas/entry.ts';
|
|
13
|
+
import { shouldLog, getNamespaceSettings, type NamespaceSettings } from './namespace.ts';
|
|
14
|
+
import {
|
|
15
|
+
createDefaultConsoleSink,
|
|
16
|
+
deriveChildConfig
|
|
17
|
+
} from '../kinds/logger.utils';
|
|
18
|
+
|
|
19
|
+
const defaultSink = createDefaultConsoleSink();
|
|
20
|
+
|
|
21
|
+
function normalizeLogContext(context: unknown): LogContext {
|
|
22
|
+
if (context === undefined || context === null) {
|
|
23
|
+
return {};
|
|
24
|
+
}
|
|
25
|
+
if (context instanceof Error) {
|
|
26
|
+
return {
|
|
27
|
+
errorName: context.name,
|
|
28
|
+
errorMessage: context.message,
|
|
29
|
+
stack: context.stack
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
if (typeof context === 'object' && !Array.isArray(context)) {
|
|
33
|
+
return context as LogContext;
|
|
34
|
+
}
|
|
35
|
+
return { value: context };
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export function createRuntimeLogger(options: RuntimeLoggerOptions): RuntimeLogger {
|
|
39
|
+
const sinks: SinkImplementation[] = options.sinkImpls ?? [defaultSink];
|
|
40
|
+
|
|
41
|
+
const config: RuntimeLoggerConfig = {
|
|
42
|
+
namespace: options.namespace,
|
|
43
|
+
fullNamespace: options.namespace,
|
|
44
|
+
runtime: options.runtime ?? 'server',
|
|
45
|
+
staticMetadata: { runtime: options.runtime ?? 'server', ...options.staticMetadata },
|
|
46
|
+
sinkIds: options.sinks ?? ['console']
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
const getLevelSettings = (): NamespaceSettings => {
|
|
50
|
+
const base = getNamespaceSettings();
|
|
51
|
+
if (options.level && base.defaultLevel !== options.level) {
|
|
52
|
+
return { ...base, defaultLevel: options.level };
|
|
53
|
+
}
|
|
54
|
+
return base;
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
const emitEntry = (level: LogLevel, message: string, ctx?: unknown, fullNs?: string): void => {
|
|
58
|
+
const ns = fullNs ?? config.namespace;
|
|
59
|
+
if (!shouldLog({ namespace: ns, level, settings: getLevelSettings() })) return;
|
|
60
|
+
const entry: RuntimeLogEntry = {
|
|
61
|
+
timestamp: new Date().toISOString(),
|
|
62
|
+
level,
|
|
63
|
+
namespace: ns,
|
|
64
|
+
message,
|
|
65
|
+
context: { ...config.staticMetadata, ...normalizeLogContext(ctx) }
|
|
66
|
+
};
|
|
67
|
+
for (const sink of sinks) {
|
|
68
|
+
try { sink.emit(entry); } catch { defaultSink.emit(entry); }
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
const buildLogger = (metadata: LogContext, fullNamespace: string): RuntimeLogger => {
|
|
73
|
+
const log = (level: LogLevel, message: string, ctx?: unknown) =>
|
|
74
|
+
emitEntry(
|
|
75
|
+
level,
|
|
76
|
+
message,
|
|
77
|
+
{ ...metadata, ...normalizeLogContext(ctx) },
|
|
78
|
+
fullNamespace
|
|
79
|
+
);
|
|
80
|
+
|
|
81
|
+
return {
|
|
82
|
+
namespace: config.namespace,
|
|
83
|
+
fullNamespace,
|
|
84
|
+
|
|
85
|
+
debug(message, ctx) { log('debug', message, ctx); },
|
|
86
|
+
info(message, ctx) { log('info', message, ctx); },
|
|
87
|
+
warn(message, ctx) { log('warn', message, ctx); },
|
|
88
|
+
error(message, ctx) { log('error', message, ctx); },
|
|
89
|
+
|
|
90
|
+
child(childOptions: LoggerChildOptions): RuntimeLogger {
|
|
91
|
+
const { nextNamespace, childMetadata } = deriveChildConfig(fullNamespace, childOptions);
|
|
92
|
+
return buildLogger({ ...metadata, ...childMetadata }, nextNamespace);
|
|
93
|
+
},
|
|
94
|
+
|
|
95
|
+
withContext(context: LogContext): RuntimeLogger {
|
|
96
|
+
return buildLogger({ ...metadata, ...context }, fullNamespace);
|
|
97
|
+
},
|
|
98
|
+
|
|
99
|
+
withRequestContext(context: RequestLogContext): RuntimeLogger {
|
|
100
|
+
const m = metadata;
|
|
101
|
+
return buildLogger({
|
|
102
|
+
...m,
|
|
103
|
+
requestId: context.requestId ?? m.requestId,
|
|
104
|
+
correlationId: context.correlationId ?? m.correlationId,
|
|
105
|
+
sessionId: context.sessionId ?? m.sessionId,
|
|
106
|
+
userId: context.userId ?? m.userId,
|
|
107
|
+
userAgent: context.userAgent ?? m.userAgent,
|
|
108
|
+
ip: context.ip ?? m.ip,
|
|
109
|
+
route: context.route ?? m.route,
|
|
110
|
+
method: context.method ?? m.method
|
|
111
|
+
}, fullNamespace);
|
|
112
|
+
},
|
|
113
|
+
|
|
114
|
+
withJobContext(context: JobLogContext): RuntimeLogger {
|
|
115
|
+
const m = metadata;
|
|
116
|
+
return buildLogger({
|
|
117
|
+
...m,
|
|
118
|
+
jobId: context.jobId ?? m.jobId,
|
|
119
|
+
queueId: context.queueId ?? m.queueId,
|
|
120
|
+
queueName: context.queueName ?? m.queueName,
|
|
121
|
+
toolId: context.toolId ?? m.toolId,
|
|
122
|
+
parentJobId: context.parentJobId ?? m.parentJobId,
|
|
123
|
+
attempt: context.attempt ?? m.attempt,
|
|
124
|
+
maxAttempts: context.maxAttempts ?? m.maxAttempts
|
|
125
|
+
}, fullNamespace);
|
|
126
|
+
},
|
|
127
|
+
|
|
128
|
+
performanceTracker(params: PerformanceTrackerParams): PerformanceTracker {
|
|
129
|
+
let startTime = 0;
|
|
130
|
+
const tracker = buildLogger(
|
|
131
|
+
{ ...metadata, operation: params.operation, ...params.metadata },
|
|
132
|
+
fullNamespace
|
|
133
|
+
);
|
|
134
|
+
return {
|
|
135
|
+
start() { startTime = Date.now(); tracker.debug(`operation.${params.operation}.start`); },
|
|
136
|
+
end(successContext?: LogContext) {
|
|
137
|
+
const duration = Date.now() - startTime;
|
|
138
|
+
tracker.info(`operation.${params.operation}.success`, { duration, ...successContext });
|
|
139
|
+
},
|
|
140
|
+
fail(error: unknown, errorContext?: LogContext) {
|
|
141
|
+
const duration = Date.now() - startTime;
|
|
142
|
+
tracker.error(`operation.${params.operation}.failure`, { duration, error, ...errorContext });
|
|
143
|
+
}
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
};
|
|
147
|
+
};
|
|
148
|
+
|
|
149
|
+
return buildLogger(options.staticMetadata ?? {}, config.namespace);
|
|
150
|
+
}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Namespace Filtering
|
|
3
|
+
*
|
|
4
|
+
* Controls which log entries are emitted based on namespace patterns.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { type LogLevel, LOG_LEVEL_ORDER } from '../schemas/entry.ts';
|
|
8
|
+
|
|
9
|
+
const DEFAULT_LEVEL: LogLevel = 'info';
|
|
10
|
+
const REGEX_SPECIAL_CHARS = /[\\^$+?.()|[\]{}]/g;
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* A compiled namespace selector.
|
|
14
|
+
*/
|
|
15
|
+
export interface NamespaceSelector {
|
|
16
|
+
raw: string;
|
|
17
|
+
regex: RegExp;
|
|
18
|
+
isExclusion: boolean;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Namespace selectors (includes and excludes).
|
|
23
|
+
*/
|
|
24
|
+
export interface NamespaceSelectors {
|
|
25
|
+
includes: NamespaceSelector[];
|
|
26
|
+
excludes: NamespaceSelector[];
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Full namespace settings with level.
|
|
31
|
+
*/
|
|
32
|
+
export interface NamespaceSettings extends NamespaceSelectors {
|
|
33
|
+
defaultLevel: LogLevel;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
type EnvRecord = Record<string, string | undefined>;
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Compile a glob pattern to regex.
|
|
40
|
+
*/
|
|
41
|
+
function compilePattern(pattern: string): RegExp {
|
|
42
|
+
const escaped = pattern.replace(REGEX_SPECIAL_CHARS, '\\$&').replace(/\*/g, '.*');
|
|
43
|
+
return new RegExp(`^${escaped}$`);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Parse a selector string into includes/excludes.
|
|
48
|
+
* Format: "namespace1,namespace2,-excluded1,-excluded2"
|
|
49
|
+
*/
|
|
50
|
+
function parseSelectors(raw: string): NamespaceSelectors {
|
|
51
|
+
const selectors: NamespaceSelectors = { includes: [], excludes: [] };
|
|
52
|
+
|
|
53
|
+
for (const token of raw.split(',').map((value) => value.trim())) {
|
|
54
|
+
if (!token) continue;
|
|
55
|
+
|
|
56
|
+
const isExclusion = token.startsWith('-');
|
|
57
|
+
const normalized = isExclusion ? token.slice(1) : token;
|
|
58
|
+
if (!normalized) continue;
|
|
59
|
+
|
|
60
|
+
const selector: NamespaceSelector = {
|
|
61
|
+
raw: normalized,
|
|
62
|
+
regex: compilePattern(normalized),
|
|
63
|
+
isExclusion
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
if (isExclusion) {
|
|
67
|
+
selectors.excludes.push(selector);
|
|
68
|
+
} else {
|
|
69
|
+
selectors.includes.push(selector);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
return selectors;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Normalize a level string to LogLevel.
|
|
78
|
+
*/
|
|
79
|
+
function normalizeLevel(level?: string | null): LogLevel {
|
|
80
|
+
switch ((level || '').toLowerCase()) {
|
|
81
|
+
case 'debug':
|
|
82
|
+
return 'debug';
|
|
83
|
+
case 'warn':
|
|
84
|
+
return 'warn';
|
|
85
|
+
case 'error':
|
|
86
|
+
return 'error';
|
|
87
|
+
default:
|
|
88
|
+
return 'info';
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Parse namespace settings from input string.
|
|
94
|
+
*/
|
|
95
|
+
export function parseNamespaceSettings({
|
|
96
|
+
input,
|
|
97
|
+
defaultLevel
|
|
98
|
+
}: {
|
|
99
|
+
input?: string | null;
|
|
100
|
+
defaultLevel?: string | null;
|
|
101
|
+
}): NamespaceSettings {
|
|
102
|
+
const selectors = input ? parseSelectors(input) : { includes: [], excludes: [] };
|
|
103
|
+
return {
|
|
104
|
+
...selectors,
|
|
105
|
+
defaultLevel: normalizeLevel(defaultLevel)
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Parse namespace settings from environment variables.
|
|
111
|
+
*/
|
|
112
|
+
export function parseNamespaceSettingsFromEnv(env: EnvRecord): NamespaceSettings {
|
|
113
|
+
const logSelectors = env.VIBES_LOG ?? env.vibes_log ?? undefined;
|
|
114
|
+
const level =
|
|
115
|
+
env.VIBES_LOG_LEVEL ?? env.vibes_log_level ?? env.LOG_LEVEL ?? env.log_level ?? undefined;
|
|
116
|
+
|
|
117
|
+
return parseNamespaceSettings({
|
|
118
|
+
input: logSelectors,
|
|
119
|
+
defaultLevel: level
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Check if a namespace matches a selector.
|
|
125
|
+
*/
|
|
126
|
+
export function matchesSelector(namespace: string, selector: NamespaceSelector): boolean {
|
|
127
|
+
return selector.regex.test(namespace);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Check if a namespace is included by settings.
|
|
132
|
+
*/
|
|
133
|
+
export function isNamespaceIncluded(namespace: string, settings: NamespaceSelectors): boolean {
|
|
134
|
+
const included =
|
|
135
|
+
settings.includes.length === 0 ||
|
|
136
|
+
settings.includes.some((selector) => matchesSelector(namespace, selector));
|
|
137
|
+
if (!included) return false;
|
|
138
|
+
return !settings.excludes.some((selector) => matchesSelector(namespace, selector));
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Determine if a log entry should be emitted.
|
|
143
|
+
*/
|
|
144
|
+
export function shouldLog({
|
|
145
|
+
namespace,
|
|
146
|
+
level,
|
|
147
|
+
settings
|
|
148
|
+
}: {
|
|
149
|
+
namespace: string;
|
|
150
|
+
level: LogLevel;
|
|
151
|
+
settings: NamespaceSettings;
|
|
152
|
+
}): boolean {
|
|
153
|
+
const defaultLevel = settings.defaultLevel ?? DEFAULT_LEVEL;
|
|
154
|
+
const levelIndex = LOG_LEVEL_ORDER[level];
|
|
155
|
+
const baselineIndex = LOG_LEVEL_ORDER[defaultLevel] ?? LOG_LEVEL_ORDER[DEFAULT_LEVEL];
|
|
156
|
+
|
|
157
|
+
if (levelIndex >= baselineIndex) {
|
|
158
|
+
return !settings.excludes.some((selector) => matchesSelector(namespace, selector));
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
return settings.includes.some((selector) => matchesSelector(namespace, selector));
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* Default namespace settings.
|
|
166
|
+
*/
|
|
167
|
+
export const defaultNamespaceSettings: NamespaceSettings = {
|
|
168
|
+
includes: [],
|
|
169
|
+
excludes: [],
|
|
170
|
+
defaultLevel: DEFAULT_LEVEL
|
|
171
|
+
};
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* Global active namespace settings.
|
|
175
|
+
* Updated from environment or explicit configuration.
|
|
176
|
+
*
|
|
177
|
+
* Initialization is lazy: defaults are used until explicitly configured
|
|
178
|
+
* via updateNamespaceSettings(). The logging-fs plugin initializes
|
|
179
|
+
* settings from the host environment at startup automatically.
|
|
180
|
+
*/
|
|
181
|
+
let activeNamespaceSettings: NamespaceSettings = defaultNamespaceSettings;
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* Update the active namespace settings.
|
|
185
|
+
*/
|
|
186
|
+
export function updateNamespaceSettings(settings: NamespaceSettings): void {
|
|
187
|
+
activeNamespaceSettings = settings;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* Get the current active namespace settings.
|
|
192
|
+
*/
|
|
193
|
+
export function getNamespaceSettings(): NamespaceSettings {
|
|
194
|
+
return activeNamespaceSettings;
|
|
195
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export function parseSize(size: string | undefined): number {
|
|
2
|
+
if (!size) return 10 * 1024 * 1024;
|
|
3
|
+
const units: Record<string, number> = { B: 1, KB: 1024, MB: 1024 ** 2, GB: 1024 ** 3 };
|
|
4
|
+
const match = size.match(/^(\d+(?:\.\d+)?)\s*(B|KB|MB|GB)$/i);
|
|
5
|
+
if (!match) return 10 * 1024 * 1024;
|
|
6
|
+
return Math.floor(parseFloat(match[1]) * (units[match[2].toUpperCase()] ?? 1));
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export function parseDuration(duration: string | undefined): number {
|
|
10
|
+
if (!duration) return 7 * 24 * 60 * 60 * 1000;
|
|
11
|
+
const units: Record<string, number> = {
|
|
12
|
+
s: 1000,
|
|
13
|
+
m: 60 * 1000,
|
|
14
|
+
h: 60 * 60 * 1000,
|
|
15
|
+
d: 24 * 60 * 60 * 1000,
|
|
16
|
+
w: 7 * 24 * 60 * 60 * 1000
|
|
17
|
+
};
|
|
18
|
+
const match = duration.match(/^(\d+)\s*(s|m|h|d|w)$/i);
|
|
19
|
+
if (!match) return 7 * 24 * 60 * 60 * 1000;
|
|
20
|
+
return parseInt(match[1], 10) * (units[match[2].toLowerCase()] ?? 1);
|
|
21
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core Logger Types
|
|
3
|
+
*
|
|
4
|
+
* Interfaces for logger instances and factories.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type {
|
|
8
|
+
LogLevel,
|
|
9
|
+
LogContext,
|
|
10
|
+
LoggerChildOptions,
|
|
11
|
+
RequestLogContext,
|
|
12
|
+
JobLogContext,
|
|
13
|
+
PerformanceTracker,
|
|
14
|
+
PerformanceTrackerParams
|
|
15
|
+
} from '../schemas/entry.ts';
|
|
16
|
+
import type { SinkImplementation } from '../kinds/sink.ts';
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Base logger interface.
|
|
20
|
+
*/
|
|
21
|
+
export interface Logger {
|
|
22
|
+
debug(message: string, context?: unknown): void;
|
|
23
|
+
info(message: string, context?: unknown): void;
|
|
24
|
+
warn(message: string, context?: unknown): void;
|
|
25
|
+
error(message: string, context?: unknown): void;
|
|
26
|
+
child?(options: LoggerChildOptions): Logger;
|
|
27
|
+
namespace?: string;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Extended runtime logger with context helpers.
|
|
32
|
+
*/
|
|
33
|
+
export interface RuntimeLogger extends Logger {
|
|
34
|
+
/** Create a child logger with additional context */
|
|
35
|
+
child(options: LoggerChildOptions): RuntimeLogger;
|
|
36
|
+
/** Add arbitrary context to this logger */
|
|
37
|
+
withContext(context: LogContext): RuntimeLogger;
|
|
38
|
+
/** Add request-specific context */
|
|
39
|
+
withRequestContext(context: RequestLogContext): RuntimeLogger;
|
|
40
|
+
/** Add job-specific context */
|
|
41
|
+
withJobContext(context: JobLogContext): RuntimeLogger;
|
|
42
|
+
/** Create a performance tracker for timing operations */
|
|
43
|
+
performanceTracker(params: PerformanceTrackerParams): PerformanceTracker;
|
|
44
|
+
/** Logger namespace */
|
|
45
|
+
namespace: string;
|
|
46
|
+
/** Full namespace path (including parent namespaces) */
|
|
47
|
+
fullNamespace: string;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Runtime type identifier.
|
|
52
|
+
*/
|
|
53
|
+
export type Runtime = 'server' | 'cli' | 'worker' | 'browser' | 'mcp';
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Options for creating a runtime logger.
|
|
57
|
+
*/
|
|
58
|
+
export interface RuntimeLoggerOptions {
|
|
59
|
+
/** Base namespace (e.g., 'vibes', 'pm') */
|
|
60
|
+
namespace: string;
|
|
61
|
+
/** Runtime environment */
|
|
62
|
+
runtime?: Runtime;
|
|
63
|
+
/** Override default log level */
|
|
64
|
+
level?: LogLevel;
|
|
65
|
+
/** Static metadata added to all entries */
|
|
66
|
+
staticMetadata?: LogContext;
|
|
67
|
+
/** Custom sink IDs for runtime resolution */
|
|
68
|
+
sinks?: string[];
|
|
69
|
+
/** Direct sink implementations (bypasses runtime resolution) */
|
|
70
|
+
sinkImpls?: SinkImplementation[];
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Internal logger configuration.
|
|
75
|
+
*/
|
|
76
|
+
export interface RuntimeLoggerConfig {
|
|
77
|
+
namespace: string;
|
|
78
|
+
fullNamespace: string;
|
|
79
|
+
runtime: Runtime;
|
|
80
|
+
staticMetadata: LogContext;
|
|
81
|
+
sinkIds: string[];
|
|
82
|
+
}
|