Hyperlinkv0.8.0-beta.28

Logger

Logger.layerconsteffect/Logger.ts:1130
<
  const Loggers extends ReadonlyArray<
    | Logger<unknown, unknown>
    | Effect.Effect<Logger<unknown, unknown>, any, any>
  >
>(
  loggers: Loggers,
  options?:
    | { readonly mergeWithExisting?: boolean | undefined }
    | undefined
): Layer.Layer<
  never,
  Loggers extends readonly [] ? never : Effect.Error<Loggers[number]>,
  Exclude<
    Loggers extends readonly []
      ? never
      : Effect.Services<Loggers[number]>,
    Scope.Scope
  >
>

Creates a Layer which will overwrite the current set of loggers with the specified array of loggers.

Details

If the specified array of loggers should be merged with the current set of loggers (instead of overwriting them), set mergeWithExisting to true.

Example (Providing logger layers)

import { Effect, Logger } from "effect"

// Single logger layer
const JsonLoggerLive = Logger.layer([Logger.consoleJson])

// Multiple loggers layer
const MultiLoggerLive = Logger.layer([
  Logger.consoleJson,
  Logger.consolePretty(),
  Logger.formatStructured
])

// Merge with existing loggers
const AdditionalLoggerLive = Logger.layer(
  [Logger.consoleJson],
  { mergeWithExisting: true }
)

// Using multiple logger formats
const jsonLogger = Logger.consoleJson
const prettyLogger = Logger.consolePretty()

const CustomLoggerLive = Logger.layer([jsonLogger, prettyLogger])

const program = Effect.log("Application started").pipe(
  Effect.provide(CustomLoggerLive)
)
context
Source effect/Logger.ts:113023 lines
export const layer = <
  const Loggers extends ReadonlyArray<Logger<unknown, unknown> | Effect.Effect<Logger<unknown, unknown>, any, any>>
>(
  loggers: Loggers,
  options?: { readonly mergeWithExisting?: boolean | undefined } | undefined
): Layer.Layer<
  never,
  Loggers extends readonly [] ? never : Effect.Error<Loggers[number]>,
  Exclude<
    Loggers extends readonly [] ? never : Effect.Services<Loggers[number]>,
    Scope.Scope
  >
> =>
  Layer.effect(
    CurrentLoggers,
    withFiber(effect.fnUntraced(function*(fiber) {
      const currentLoggers = new Set(options?.mergeWithExisting === true ? fiber.getRef(effect.CurrentLoggers) : [])
      for (const logger of loggers) {
        currentLoggers.add(isEffect(logger) ? yield* logger : logger)
      }
      return currentLoggers
    }))
  )