effect-logger-pretty
v0.2.0
Published
A zero-dependency, ridiculously pretty console logger for Effect-TS. Dev-only magic, prod-safe.
Maintainers
Readme
effect-logger-pretty
Zero-dependency, ridiculously pretty console logger for Effect-TS.
Beautiful, colorful, one-line logs in development → completely silent in production.
Before vs After
Default Effect Logger

With effect-logger-pretty

Install
npm i effect-logger-pretty
# or
pnpm add effect-logger-pretty
# or
yarn add effect-logger-prettyUsage — 3 lines and you're done
Create example.ts:
import { Effect, Schedule } from "effect";
import { withPrettyLogger } from "effect-logger-pretty";
const program = Effect.log("Hello from effect-logger-pretty!")
.pipe(Effect.delay("2 seconds"))
.pipe(Effect.repeat(Schedule.spaced("500 millis").pipe(Schedule.recurs(8))));
await Effect.runPromise(program.pipe(withPrettyLogger));Run it:
npx tsx example.tsOutput (with real colors in your terminal):
15:44:23 INFO Hello from effect-logger-pretty! 2.01s
15:44:24 INFO Hello from effect-logger-pretty! 501ms
15:44:25 INFO Hello from effect-logger-pretty! 501ms
15:44:25 INFO Hello from effect-logger-pretty! 501ms
...Advanced: Use as a Layer (recommended for real apps)
import { Effect, Layer } from "effect";
import { PrettyLoggerLayer } from "effect-logger-pretty";
const program = Effect.log("Running with Layer!").pipe(
Effect.annotateLogs({ userId: "42", feature: "onboarding" }),
);
await Effect.runPromise(program.pipe(Effect.provide(PrettyLoggerLayer)));Result:
16:01:12 INFO Running with Layer! userId="42" feature="onboarding"Features
- Full terminal colors (via tiny picocolors)
- Smart duration formatting (ms → s when >1s)
- Beautiful error stacks, strings, annotations, Uint8Arrays, etc.
- Local time (not UTC)
- One clean line per log — super easy to scan
- Automatically disabled in production (
process.env.NODE_ENV === "production") - < 100 lines total, zero runtime deps besides Effect
API
import {
withPrettyLogger,
prettyLogger,
PrettyLoggerLayer,
} from "effect-logger-pretty";
// Quick pipeable way
program.pipe(withPrettyLogger);
// Or classic provide
Effect.provide(program, PrettyLoggerLayer);
// Or replace globally
Logger.replace(Logger.defaultLogger, prettyLogger);License
MIT © 2025
