/** * This Source Code is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * Copyright (c) Infonomic Company Limited * * Structured logging for Byline CMS. * * ## Architecture * * This module defines two layers: * * 1. **Transport-agnostic interface** — `BylineLogger`, `LogLevel`, `LogData`, * `LogContext`, `withLogContext`. These have zero dependency on any logging * library. All consumer code (services, db adapters, route handlers, errors) * depends only on this layer. * * 2. **Pino transport** — `createBylineLogger` + `BylineLoggerImpl`. This is * the default implementation registered in the DI graph via `core.ts`. To * swap transports (e.g. for Cloudflare Workers or edge runtimes), provide a * different factory that produces a `BylineLogger` and register it in the * Registry instead of `createBylineLogger`. * * Context propagation uses `AsyncLocalStorage` (Node/Bun/Deno/Workers) with a * no-op fallback for environments that don't support it (browser bundles). * When TC39 `AsyncContext` reaches Stage 3+, this can be swapped transparently. * * Primary access is via the typed Registry (see core.ts). A globalThis * singleton (defineLogger / getLogger) provides an escape hatch for code * outside the DI graph (e.g. API route handlers, db adapters). */ import type { Logger as PinoLogger } from 'pino'; export interface LogContext { domain?: string; module?: string; class?: string; function?: string; } export declare const getLogContext: () => LogContext; export declare const withLogContext: (context: LogContext, fn: () => T) => T; export type LogLevel = 'fatal' | 'error' | 'warn' | 'info' | 'debug' | 'trace'; export type LogLevelWithSilent = LogLevel | 'silent'; export type LogData = Record; type LogFnArgs = [message: string, ...args: unknown[]] | [data: LogData, message?: string, ...args: unknown[]]; export interface BylineLogger { log(level: LogLevel, ...args: LogFnArgs): void; fatal(...args: LogFnArgs): void; error(...args: LogFnArgs): void; warn(...args: LogFnArgs): void; info(...args: LogFnArgs): void; debug(...args: LogFnArgs): void; trace(...args: LogFnArgs): void; silent(...args: LogFnArgs): void; } export declare const createBylineLogger: (deps: { pinoLogger: PinoLogger; }) => BylineLogger; export declare function defineLogger(logger: BylineLogger): void; export declare function getLogger(): BylineLogger; export {};