Debug Logging
debug-compatible namespace filtering with DEBUG=myapp,-myapp:noisy. Uses native console methods so source lines stay clickable in DevTools.
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.
npm install loggilybun add loggilypnpm add loggilyyarn add loggilyimport { 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"))// 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()
}