Skip to content

Logger

createLogger

typescript
function createLogger(name: string, props?: Record<string, unknown>): ConditionalLogger

Create a conditional logger. Disabled log levels return undefined -- use ?. to skip argument evaluation when disabled.

typescript
const log = createLogger("myapp", { version: "2.1" })
log.info?.("started")

Logger Methods

Logging

All accept LazyMessage (string or () => string) and optional data:

typescript
log.trace?.("verbose", { detail: "..." })
log.debug?.("debugging", { state: "..." })
log.info?.("normal operation")
log.warn?.("recoverable issue")
log.error?.(new Error("failed"))
log.error?.("manual error", { code: "ETIMEOUT" })

Child Creation

typescript
// Extend namespace, inherit props
const db = log.logger("db", { pool: "primary" })
// namespace: "myapp:db", props: { version: "2.1", pool: "primary" }

// Add context to every message (same namespace)
const req = log.child({ requestId: "abc" })

// Create timed span
{
  using span = log.span("import")
  span.spanData.count = 42
}

Manual Span End

typescript
const span = log.span("op")
try {
  /* ... */
} finally {
  span.end()
}

ConditionalLogger

The return type of createLogger(). Log methods are possibly undefined:

typescript
interface ConditionalLogger {
  readonly name: string
  readonly props: Readonly<Record<string, unknown>>
  trace?: (msg: LazyMessage, data?: Record<string, unknown>) => void
  debug?: (msg: LazyMessage, data?: Record<string, unknown>) => void
  info?: (msg: LazyMessage, data?: Record<string, unknown>) => void
  warn?: (msg: LazyMessage, data?: Record<string, unknown>) => void
  error?: (msg: LazyMessage | Error, data?: Record<string, unknown>) => void
  logger(ns?: string, props?: Record<string, unknown>): Logger
  span(ns?: string, props?: Record<string, unknown>): SpanLogger
  child(context: Record<string, unknown>): Logger
  end(): void
}

SpanLogger

Logger + timing + Disposable:

typescript
interface SpanLogger extends Logger, Disposable {
  readonly spanData: SpanData & { [key: string]: unknown }
}

SpanData

PropertyTypeWritableDescription
idstringNosp_1, sp_2, ...
traceIdstringNoShared across nested spans
parentIdstring | nullNoParent span ID
startTimenumberNoStart timestamp
endTimenumber | nullNoEnd timestamp
durationnumberNoLive computed duration
[custom]unknownYesspan.spanData.key = value

Released under the MIT License.