Skip to main content

CHANGELOG.md

# Changelog

All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

<!-- %% CHANGELOG_ENTRIES %% -->

## 0.4.0 - 2026-05-25

### Added

- `:connect_options` configuration option, passed through to `Req.post` so the
  HTTP connection used to push to Loki can be customised (connect timeout,
  `:protocols`, `:transport_opts` for SSL/TLS, `:proxy`, etc.). See the keys
  documented under `:connect_options` in the Req docs.
  Thanks to [@gabrielmancini](https://github.com/gabrielmancini).

## 0.3.0 - 2026-05-25

### Added

- `[:loki_logger_handler, :format, :error]` telemetry event - emitted when an
  event cannot be formatted and a fallback entry is buffered instead

### Fixed

- A single malformed log event can no longer remove the handler from `:logger`.
  Formatting now runs inside a rescue: on failure the handler buffers a best-effort
  fallback entry and emits a telemetry event rather than letting the exception
  propagate and disable the handler. The formatter also degrades gracefully on
  unexpected message, `report_cb`, and timestamp shapes instead of raising.

## 0.2.0 - 2026-01-22

### Added

- Telemetry events for buffer monitoring:
  - `[:loki_logger_handler, :buffer, :insert]` - emitted after buffering a log entry
  - `[:loki_logger_handler, :buffer, :remove]` - emitted after sending and removing entries


## 0.1.1 - 2026-01-13

### Added

- Erlang `:logger` handler implementation for Grafana Loki
- Configurable storage strategy:
  - `:disk` (default) - CubDB-backed persistent storage that survives restarts
  - `:memory` - ETS-backed in-memory storage for higher throughput
- Configurable label extraction from log metadata
- Structured metadata support (Loki 2.9+)
- Dual threshold batching (time interval and batch size)
- Exponential backoff on Loki unavailability
- Buffer overflow protection (drops oldest logs when full)
- Multiple handler support for different Loki endpoints
- `LokiLoggerHandler.FakeLoki` test server with ephemeral port support
- Flush API for graceful shutdown
- Runtime configuration updates