# 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.*
[](https://hex.pm/packages/glogg)
[](https://hexdocs.pm/glogg/)
## Features
- **Structured JSON Logging** - Clean, parseable log output
- **Type-Safe Fields** - String, Int, Float, Bool, Duration and nested Group fields
- **Stacktrace** - Capture and log stacktraces
- **Cross-Platform** - Works on both Erlang and JavaScript targets
## Quick Start
```sh
gleam add glogg
```
```gleam
import glogg.{bool, info, int, string}
pub fn main() {
glogg.configure_default_json_formatting()
glogg.configure_default_minimum_level(glogg.Debug)
glogg.new()
|> info("this is fine", [
bool("everything_burning", True),
string("glogg_temperature", "still_hot"),
int("production_issues", 42069)
])
}
```
## Usage Examples
### Structured Fields
```gleam
info(logger, "processing payment", [
string("payment_id", "pay_123"),
float("amount", 29.99),
int("user_id", 12345),
bool("verified", True),
duration_ms("processing_time", duration.millisecond(150)
])
```
#### Stacktrace
```gleam
error(logger, "huge issue", [
string("payment_id", "pay_123"),
int("user_id", 12345),
stacktrace()
])
```
### Nested Fields
```gleam
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
```gleam
// Configures the BEAM logger to output JSON to stdout.
// This should be done once at the start of your application.
// It is a no-op on JavaScript targets.
glogg.configure_default_json_formatting()
// Set the minimum log level
// (Debug, Info, Notice, Warning, Error, Critical, Alert, Emergency)
glogg.configure_default_minimum_level(glogg.Info)
// 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 = glogg.add_default_fields(logger, [
string("environment", "production")
])
```