Logger<unknown, void>A Logger which includes log messages as tracer span events.
Details
This logger integrates logging with distributed tracing by recording all log messages as events on the current trace span, making them visible in tracing tools like OpenTelemetry, Jaeger, or Zipkin.
This logger is included in the default set of loggers for all Effect programs, so log messages automatically appear as span events unless you override the default loggers.
Example (Recording logs as trace span events)
import { Effect, Logger } from "effect"
// Tracer logger is included by default - logs automatically become span events
const defaultProgram = Effect.gen(function*() {
yield* Effect.log("This automatically becomes a span event")
yield* Effect.logInfo("Processing data")
})
// Explicitly combine tracer logger with other loggers
const observabilityProgram = Effect.gen(function*() {
yield* Effect.log("Operation started")
yield* Effect.logInfo("Processing data")
yield* Effect.logError("Error occurred")
}).pipe(
Effect.withLogSpan("data-processing"),
Effect.provide(Logger.layer([
Logger.tracerLogger,
Logger.consoleJson
]))
)
// Perfect for correlating logs with traces in distributed systems
const distributedProgram = Effect.gen(function*() {
yield* Effect.log("Step 1: Fetching user data")
yield* Effect.sleep("100 millis")
yield* Effect.log("Step 2: Processing payment")
yield* Effect.sleep("200 millis")
yield* Effect.log("Step 3: Sending confirmation")
}).pipe(
Effect.withLogSpan("payment-workflow"),
Effect.annotateLogs("userId", "user-123"),
Effect.provide(Logger.layer([Logger.tracerLogger]))
)export const const tracerLogger: Logger<unknown, void>const tracerLogger: {
log: (options: Options<unknown>) => void;
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
}
A Logger which includes log messages as tracer span events.
Details
This logger integrates logging with distributed tracing by recording
all log messages as events on the current trace span, making them visible
in tracing tools like OpenTelemetry, Jaeger, or Zipkin.
This logger is included in the default set of loggers for all Effect programs,
so log messages automatically appear as span events unless you override the
default loggers.
Example (Recording logs as trace span events)
import { Effect, Logger } from "effect"
// Tracer logger is included by default - logs automatically become span events
const defaultProgram = Effect.gen(function*() {
yield* Effect.log("This automatically becomes a span event")
yield* Effect.logInfo("Processing data")
})
// Explicitly combine tracer logger with other loggers
const observabilityProgram = Effect.gen(function*() {
yield* Effect.log("Operation started")
yield* Effect.logInfo("Processing data")
yield* Effect.logError("Error occurred")
}).pipe(
Effect.withLogSpan("data-processing"),
Effect.provide(Logger.layer([
Logger.tracerLogger,
Logger.consoleJson
]))
)
// Perfect for correlating logs with traces in distributed systems
const distributedProgram = Effect.gen(function*() {
yield* Effect.log("Step 1: Fetching user data")
yield* Effect.sleep("100 millis")
yield* Effect.log("Step 2: Processing payment")
yield* Effect.sleep("200 millis")
yield* Effect.log("Step 3: Sending confirmation")
}).pipe(
Effect.withLogSpan("payment-workflow"),
Effect.annotateLogs("userId", "user-123"),
Effect.provide(Logger.layer([Logger.tracerLogger]))
)
tracerLogger: interface Logger<in Message, out Output>A logger that transforms a runtime log event into an output value.
Details
The runtime calls log with the message, level, cause, fiber, and timestamp
for each log event. Use Logger.layer to install one or more loggers for an
effect.
Example (Creating custom loggers)
import { Effect, Logger } from "effect"
// Create a custom logger that accepts unknown messages and returns void
const stringLogger = Logger.make<unknown, void>((options) => {
console.log(`[${options.logLevel}] ${options.message}`)
})
// Create a logger that accepts any message type and returns a formatted string
const formattedLogger = Logger.make<unknown, string>((options) =>
`${options.date.toISOString()} [${options.logLevel}] ${options.message}`
)
// Use the logger in an Effect program
const program = Effect.log("Hello World").pipe(
Effect.provide(Logger.layer([stringLogger]))
)
Logger<unknown, void> = import effecteffect.const tracerLogger: Logger<unknown, void>const tracerLogger: {
log: (options: Options<unknown>) => void;
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
}
tracerLogger