glogg

A simple, structured JSON logging library for Gleam that works across Erlang and JavaScript targets.

Named after the traditional Scandinavian mulled wine that warms you up during cold winter nights, this logging library aims to bring the same cozy, warming comfort to your debugging sessions.

Package Version Hex Docs

Features

Quick Start

gleam add glogg
import glogg.{bool, info, int, string}

pub fn main() {
  let logger = glogg.new()

  info(logger, "This is fine", [
    bool("everything_burning", True),
    string("glogg_temperature", "still_hot"),
    int("production_issues", 42069)
  ])
}

Output:

{"time":"2025-09-25T22:03:45.124Z","level":"INFO","msg":"This is fine","everything_burning":true,"glogg_temperature":"still_hot","production_issues":42069}

Usage Examples

Structured Fields

info(logger, "Processing payment", [
  string("payment_id", "pay_123"),
  float("amount", 29.99),
  int("user_id", 12345),
  bool("verified", True)
])

Nested Fields

info(logger, "API request completed", [
  group("request", [
    string("method", "POST"),
    string("path", "/api/users"),
    int("status", 201)
  ]),
  group("response", [
    float("duration_ms", 45.2),
    int("bytes", 1024)
  ])
])

Logger Configuration

// Set minimum log level
let logger =
  glogg.new()
  |> with_min_level(Info)
// Only Info, Warn, Error

// Add default fields to all logs
let logger =
  glogg.new()
  |> with_default_fields([
    string("service", "web-api"),
    string("version", "1.2.3"),
  ])

// Add more default fields later
let logger =
  logger
  |> add_default_fields([string("environment", "production")])

Custom Writers

// Custom writer function
let file_writer = fn(line: String) {
  // Write to file, send to external service, etc.
  io.println("LOG: " <> line)
}

let logger =
  glogg.new()
  |> with_writer(file_writer)
  |> with_error_writer(file_writer) // Separate error writer
Search Document