Skip to content

LoggilyClarity without the clutter

One library. One namespace tree. One output pipeline. For logs (structured JSON or console), debug(), and tracing spans. Near-zero overhead from disabled log levels. Pure TypeScript. ~3KB. Zero dependencies.

Early release (0.x) — API may evolve before 1.0.

Quick Start

bash
npm install loggily
bash
bun add loggily
bash
pnpm add loggily
bash
yarn add loggily
typescript
import { createLogger } from "loggily"

const log = createLogger("myapp")

// ?. skips the entire call — including argument evaluation — when the level is disabled
log.info?.("server started", { port: 3000 })
log.debug?.("cache hit", { key: "user:42" })
log.error?.(new Error("connection lost"))

Spans

typescript
// With `using` (TS 5.2+, Bun 1.0+, Node 22+)
{
  using span = log.span("db:query", { table: "users" })
  const users = await db.query("SELECT * FROM users")
  span.spanData.count = users.length
}
// Output: SPAN myapp:db:query (45ms) {count: 100, table: "users"}

// Without `using` — call .end() manually
const span = log.span("db:query", { table: "users" })
try {
  const users = await db.query("SELECT * FROM users")
  span.spanData.count = users.length
} finally {
  span.end()
}

Released under the MIT License.