<Message, Output>(log: (options: Options<Message>) => Output): Logger<
Message,
Output
>Creates a new Logger from a log function.
Details
The log function receives an options object containing the message, log level, cause, fiber information, and timestamp, and should return the desired output.
Example (Creating loggers from functions)
import { Effect, Logger, References } from "effect"
// Simple text logger
const textLogger = Logger.make((options) =>
`${options.date.toISOString()} [${options.logLevel}] ${options.message}`
)
// Structured object logger
const objectLogger = Logger.make((options) => ({
timestamp: options.date.toISOString(),
level: options.logLevel,
message: options.message,
fiberId: options.fiber.id,
annotations: options.fiber.getRef(References.CurrentLogAnnotations)
}))
// Custom filtering logger
const filteredLogger = Logger.make((options) => {
if (options.logLevel === "Debug") {
return // Skip debug messages
}
return `${options.logLevel}: ${options.message}`
})
const program = Effect.log("Hello World").pipe(
Effect.provide(Logger.layer([textLogger]))
)export const const make: <Message, Output>(
log: (options: Options<Message>) => Output
) => Logger<Message, Output>
Creates a new Logger from a log function.
Details
The log function receives an options object containing the message, log level,
cause, fiber information, and timestamp, and should return the desired output.
Example (Creating loggers from functions)
import { Effect, Logger, References } from "effect"
// Simple text logger
const textLogger = Logger.make((options) =>
`${options.date.toISOString()} [${options.logLevel}] ${options.message}`
)
// Structured object logger
const objectLogger = Logger.make((options) => ({
timestamp: options.date.toISOString(),
level: options.logLevel,
message: options.message,
fiberId: options.fiber.id,
annotations: options.fiber.getRef(References.CurrentLogAnnotations)
}))
// Custom filtering logger
const filteredLogger = Logger.make((options) => {
if (options.logLevel === "Debug") {
return // Skip debug messages
}
return `${options.logLevel}: ${options.message}`
})
const program = Effect.log("Hello World").pipe(
Effect.provide(Logger.layer([textLogger]))
)
make: <function (type parameter) Message in <Message, Output>(log: (options: Options<Message>) => Output): Logger<Message, Output>Message, function (type parameter) Output in <Message, Output>(log: (options: Options<Message>) => Output): Logger<Message, Output>Output>(
log: (options: Options<Message>) => Outputlog: (options: Options<Message>(parameter) options: {
message: Message;
logLevel: LogLevel.LogLevel;
cause: Cause.Cause<unknown>;
fiber: Fiber.Fiber<unknown, unknown>;
date: Date;
}
options: interface Options<out Message>Information supplied to a Logger for a single log event.
Details
Includes the logged message, log level, cause, current fiber, and timestamp.
Example (Accessing logger options)
import { Effect, Logger } from "effect"
// Options interface provides all logging context
const detailedLogger = Logger.make((options) => {
const output = {
message: options.message,
level: options.logLevel,
timestamp: options.date.toISOString(),
fiberId: options.fiber.id,
hasCause: options.cause !== undefined
}
console.log(JSON.stringify(output))
})
const program = Effect.log("Processing request").pipe(
Effect.provide(Logger.layer([detailedLogger]))
)
Options<function (type parameter) Message in <Message, Output>(log: (options: Options<Message>) => Output): Logger<Message, Output>Message>) => function (type parameter) Output in <Message, Output>(log: (options: Options<Message>) => Output): Logger<Message, Output>Output
) => 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<function (type parameter) Message in <Message, Output>(log: (options: Options<Message>) => Output): Logger<Message, Output>Message, function (type parameter) Output in <Message, Output>(log: (options: Options<Message>) => Output): Logger<Message, Output>Output> = import effecteffect.const loggerMake: <Message, Output>(
log: (
options: Logger.Options<Message>
) => Output
) => Logger.Logger<Message, Output>
loggerMake