diff --git a/README.md b/README.md index 00ba9f5..9d1b134 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@

Latest version - Go Reference + Go Reference CI License: MIT

@@ -26,8 +26,8 @@ For full documentation, read the [docs](https://go.loglayer.dev). import ( "errors" - "go.loglayer.dev" - "go.loglayer.dev/transports/structured" + "go.loglayer.dev/v2" + "go.loglayer.dev/transports/structured/v2" ) log := loglayer.New(loglayer.Config{ @@ -85,7 +85,7 @@ log.WithPrefix("[my-app]"). ## Install ```sh -go get go.loglayer.dev +go get go.loglayer.dev/v2 ``` ## Documentation @@ -98,7 +98,7 @@ Coming from [loglayer for TypeScript](https://loglayer.dev)? See [For TypeScript ## Contributing -This is a multi-module repo: the framework core lives at the root (`go.loglayer.dev`); every transport, plugin, and integration ships as its own independently-versioned Go module under `transports/`, `plugins/`, and `integrations/`. +This is a multi-module repo: the framework core lives at the root (`go.loglayer.dev/v2`); every transport, plugin, and integration ships as its own independently-versioned Go module under `transports/`, `plugins/`, and `integrations/`. - **Dev-loop on-ramp** (prerequisites, hooks, make targets, commits, tests, docs, releases via [monorel](https://monorel.disaresta.com)): [CONTRIBUTING.md](CONTRIBUTING.md). - **Architectural context** (multi-module split, thread-safety contract, performance log, release flow internals): [AGENTS.md](AGENTS.md). diff --git a/docs/src/benchmarks.md b/docs/src/benchmarks.md index 6a2f6c7..1b96797 100644 --- a/docs/src/benchmarks.md +++ b/docs/src/benchmarks.md @@ -72,11 +72,11 @@ With LogLayer, swapping the underlying transport is a one-line change in `New()` ```go import ( - "go.loglayer.dev" - "go.loglayer.dev/integrations/sloghandler" - "go.loglayer.dev/transports/structured" - llzero "go.loglayer.dev/transports/zerolog" - llzap "go.loglayer.dev/transports/zap" + "go.loglayer.dev/v2" + "go.loglayer.dev/integrations/sloghandler/v2" + "go.loglayer.dev/transports/structured/v2" + llzero "go.loglayer.dev/transports/zerolog/v2" + llzap "go.loglayer.dev/transports/zap/v2" ) // Wrap zerolog (142 ns) diff --git a/docs/src/cheatsheet.md b/docs/src/cheatsheet.md index d54b602..2728224 100644 --- a/docs/src/cheatsheet.md +++ b/docs/src/cheatsheet.md @@ -9,8 +9,8 @@ description: One-page quick reference of the LogLayer for Go API. ```go import ( - "go.loglayer.dev" - "go.loglayer.dev/transports/structured" + "go.loglayer.dev/v2" + "go.loglayer.dev/transports/structured/v2" ) log := loglayer.New(loglayer.Config{Transport: structured.New(structured.Config{})}) @@ -61,10 +61,10 @@ log.Panic("...") // calls panic(joined-message) after dispatch; recoverable Each method takes `...any`, joined with a space. -For `fmt.Sprintf`-style format strings, register the optional [`fmtlog`](https://pkg.go.dev/go.loglayer.dev/plugins/fmtlog) plugin: +For `fmt.Sprintf`-style format strings, register the optional [`fmtlog`](https://pkg.go.dev/go.loglayer.dev/plugins/fmtlog/v2) plugin: ```go -import "go.loglayer.dev/plugins/fmtlog" +import "go.loglayer.dev/plugins/fmtlog/v2" log.AddPlugin(fmtlog.New()) @@ -255,7 +255,7 @@ The merged group set is also surfaced to transports via `TransportParams.Groups` ## Plugins ```go -import "go.loglayer.dev/plugins/redact" +import "go.loglayer.dev/plugins/redact/v2" // Inline single-hook plugin via an adapter constructor log.AddPlugin(loglayer.NewDataHook("tag", func(p loglayer.BeforeDataOutParams) loglayer.Data { @@ -323,7 +323,7 @@ Off by default. Costs ~100 ns / one runtime.Caller per emission when on. The slo ## slog Interop ```go -import "go.loglayer.dev/integrations/sloghandler" +import "go.loglayer.dev/integrations/sloghandler/v2" // Make every slog.Info(...) flow through your loglayer pipeline (plugins, // fan-out, groups, level state). slog.With / WithAttrs become persistent diff --git a/docs/src/configuration.md b/docs/src/configuration.md index b069123..cafe095 100644 --- a/docs/src/configuration.md +++ b/docs/src/configuration.md @@ -71,7 +71,7 @@ loglayer.New(loglayer.Config{ Plugins to register at construction time. Equivalent to calling `log.AddPlugin` for each entry after `New`; either form is fine. ```go -import "go.loglayer.dev/plugins/redact" +import "go.loglayer.dev/plugins/redact/v2" log := loglayer.New(loglayer.Config{ Transport: structured.New(structured.Config{}), diff --git a/docs/src/for-typescript-developers.md b/docs/src/for-typescript-developers.md index 525b4a7..4ecd900 100644 --- a/docs/src/for-typescript-developers.md +++ b/docs/src/for-typescript-developers.md @@ -116,10 +116,10 @@ TypeScript's `@loglayer/transport-pino`, `@loglayer/plugin-redaction`, etc. are | TypeScript | Go | |----------------------------------|-----------------------------------------------| -| `loglayer` | `go.loglayer.dev` (core + stdlib renderers) | -| `@loglayer/transport-zerolog` | `go.loglayer.dev/transports/zerolog` | -| `@loglayer/transport-datadog` | `go.loglayer.dev/transports/datadog` | -| `@loglayer/integration-elysia` | `go.loglayer.dev/integrations/loghttp` (etc.) | +| `loglayer` | `go.loglayer.dev/v2` (core + stdlib renderers) | +| `@loglayer/transport-zerolog` | `go.loglayer.dev/transports/zerolog/v2` | +| `@loglayer/transport-datadog` | `go.loglayer.dev/transports/datadog/v2` | +| `@loglayer/integration-elysia` | `go.loglayer.dev/integrations/loghttp/v2` (etc.) | `go get` each module you actually need; the dependency graph stays focused on whatever you imported. @@ -149,7 +149,7 @@ The full set: `NewFieldsHook`, `NewMetadataHook`, `NewDataHook`, `NewMessageHook `plugins/redact` mirrors `@loglayer/plugin-redaction`. It supports key matching, regex value patterns, and json-tag-aware struct walking, all type-preserving: ```go -import "go.loglayer.dev/plugins/redact" +import "go.loglayer.dev/plugins/redact/v2" log.AddPlugin(redact.New(redact.Config{ Keys: []string{"password", "apiKey"}, @@ -157,7 +157,7 @@ log.AddPlugin(redact.New(redact.Config{ })) ``` -See [Plugins](/plugins/) for the full lifecycle, hook ordering, and nil-return semantics. Third-party plugins can use [`utils/maputil`](https://pkg.go.dev/go.loglayer.dev/utils/maputil) for the same reflection-based deep-clone primitive that the redact plugin uses. +See [Plugins](/plugins/) for the full lifecycle, hook ordering, and nil-return semantics. Third-party plugins can use [`utils/maputil`](https://pkg.go.dev/go.loglayer.dev/v2/utils/maputil) for the same reflection-based deep-clone primitive that the redact plugin uses. ## Groups @@ -197,8 +197,8 @@ If any of these are blockers for your use case, open an issue at [github.com/log // log.withMetadata({ duration: 42 }).withError(err).info('did the thing'); import ( - "go.loglayer.dev" - "go.loglayer.dev/transports/structured" + "go.loglayer.dev/v2" + "go.loglayer.dev/transports/structured/v2" ) log := loglayer.New(loglayer.Config{ diff --git a/docs/src/getting-started.md b/docs/src/getting-started.md index 8b4c65a..8e04d3a 100644 --- a/docs/src/getting-started.md +++ b/docs/src/getting-started.md @@ -5,15 +5,15 @@ description: Install LogLayer, pick a transport, and write your first structured # Getting Started -LogLayer for Go targets **Go 1.25+** for the main module: `go.loglayer.dev`. Most transports are sub-packages of that module, so you only pull in dependencies for the transports you actually use. Individual transports and plugins call out any stricter requirement on their per-page docs. +LogLayer for Go targets **Go 1.25+** for the main module: `go.loglayer.dev/v2`. Most transports are sub-packages of that module, so you only pull in dependencies for the transports you actually use. Individual transports and plugins call out any stricter requirement on their per-page docs. ## Installation -LogLayer ships as a multi-module repo: the core lives at `go.loglayer.dev`, and every transport and plugin is its own independently-versioned sub-module. You install the core plus only the transports you actually use. +LogLayer ships as a multi-module repo: the core lives at `go.loglayer.dev/v2`, and every transport and plugin is its own independently-versioned sub-module. You install the core plus only the transports you actually use. ```sh -go get go.loglayer.dev -go get go.loglayer.dev/transports/structured +go get go.loglayer.dev/v2 +go get go.loglayer.dev/transports/structured/v2 ``` ## Basic Usage with the Structured Transport @@ -26,8 +26,8 @@ package main import ( "errors" - "go.loglayer.dev" - "go.loglayer.dev/transports/structured" + "go.loglayer.dev/v2" + "go.loglayer.dev/transports/structured/v2" ) func main() { @@ -83,7 +83,7 @@ For stack traces, custom shapes, or other options, see [Error Handling](/logging If you already have an existing logging stack, LogLayer can wrap it so your call sites use the LogLayer API while emission goes through the underlying logger you've already configured. Here it is for `zerolog`: ```sh -go get go.loglayer.dev/transports/zerolog github.com/rs/zerolog +go get go.loglayer.dev/transports/zerolog/v2 github.com/rs/zerolog ``` ```go @@ -92,8 +92,8 @@ import ( zlog "github.com/rs/zerolog" - "go.loglayer.dev" - llzero "go.loglayer.dev/transports/zerolog" + "go.loglayer.dev/v2" + llzero "go.loglayer.dev/transports/zerolog/v2" ) z := zlog.New(os.Stderr).With().Timestamp().Logger() diff --git a/docs/src/index.md b/docs/src/index.md index 977ff93..93ca017 100644 --- a/docs/src/index.md +++ b/docs/src/index.md @@ -45,8 +45,8 @@ package main import ( "errors" - "go.loglayer.dev" - "go.loglayer.dev/transports/structured" + "go.loglayer.dev/v2" + "go.loglayer.dev/transports/structured/v2" ) func main() { diff --git a/docs/src/integrations/loghttp.md b/docs/src/integrations/loghttp.md index 82ace55..8e697d3 100644 --- a/docs/src/integrations/loghttp.md +++ b/docs/src/integrations/loghttp.md @@ -12,7 +12,7 @@ description: One-line HTTP middleware that derives a per-request logger and stuf Mirrors the role that `hlog.NewHandler` plays for zerolog. Works with any `net/http`-compatible router: stdlib, chi, gorilla/mux, gin, echo, etc. ```sh -go get go.loglayer.dev/integrations/loghttp +go get go.loglayer.dev/integrations/loghttp/v2 ``` ## Basic Usage @@ -21,9 +21,9 @@ go get go.loglayer.dev/integrations/loghttp import ( "net/http" - "go.loglayer.dev" - "go.loglayer.dev/integrations/loghttp" - "go.loglayer.dev/transports/structured" + "go.loglayer.dev/v2" + "go.loglayer.dev/integrations/loghttp/v2" + "go.loglayer.dev/transports/structured/v2" ) var log = loglayer.New(loglayer.Config{ diff --git a/docs/src/integrations/sloghandler.md b/docs/src/integrations/sloghandler.md index f719c1f..fe6aa92 100644 --- a/docs/src/integrations/sloghandler.md +++ b/docs/src/integrations/sloghandler.md @@ -10,7 +10,7 @@ description: "slog.Handler that routes every slog.Info(...) call through your lo `integrations/sloghandler` is a `log/slog.Handler` backed by a loglayer logger. Once installed, every `slog.Info(...)` call (yours or your dependencies') flows through loglayer's plugin pipeline, multi-transport fan-out, group routing, and level filtering. ```sh -go get go.loglayer.dev/integrations/sloghandler +go get go.loglayer.dev/integrations/sloghandler/v2 ``` This is the **slog → loglayer** direction. If you want the opposite (use loglayer's API and emit through a `*slog.Logger` you've already configured), see the [slog Transport](/transports/slog). @@ -27,10 +27,10 @@ This is the **slog → loglayer** direction. If you want the opposite (use logla import ( "log/slog" - "go.loglayer.dev" - "go.loglayer.dev/integrations/sloghandler" - "go.loglayer.dev/plugins/redact" - "go.loglayer.dev/transports/structured" + "go.loglayer.dev/v2" + "go.loglayer.dev/integrations/sloghandler/v2" + "go.loglayer.dev/plugins/redact/v2" + "go.loglayer.dev/transports/structured/v2" ) log := loglayer.New(loglayer.Config{ diff --git a/docs/src/llms.md b/docs/src/llms.md index abed88b..0309d03 100644 --- a/docs/src/llms.md +++ b/docs/src/llms.md @@ -56,5 +56,5 @@ If you're not sure, start with `llms-full.txt`. It's the lower-friction option. ## Other ways to feed loglayer to an LLM - **Source code** at [github.com/loglayer/loglayer-go](https://github.com/loglayer/loglayer-go) is small enough to fit in most coding assistants' context. -- **pkg.go.dev** (`pkg.go.dev/go.loglayer.dev`) renders all GoDoc, including type signatures and doc comments. Useful for fact-checking the model's output. +- **pkg.go.dev** (`pkg.go.dev/go.loglayer.dev/v2`) renders all GoDoc, including type signatures and doc comments. Useful for fact-checking the model's output. - **This docs site** is itself indexed by most search-augmented assistants. Asking "from the loglayer.dev Go docs, ..." often works without any setup. diff --git a/docs/src/logging-api/basic-logging.md b/docs/src/logging-api/basic-logging.md index 86fd6f9..175395e 100644 --- a/docs/src/logging-api/basic-logging.md +++ b/docs/src/logging-api/basic-logging.md @@ -125,7 +125,7 @@ Drop the result into anything that takes the corresponding type: import ( "net/http" - "go.loglayer.dev" + "go.loglayer.dev/v2" ) srv := &http.Server{ diff --git a/docs/src/logging-api/groups.md b/docs/src/logging-api/groups.md index bffe126..4e2706b 100644 --- a/docs/src/logging-api/groups.md +++ b/docs/src/logging-api/groups.md @@ -15,10 +15,10 @@ Define groups when creating the logger: ```go import ( - "go.loglayer.dev" - "go.loglayer.dev/transports/structured" - "go.loglayer.dev/transports/datadog" - "go.loglayer.dev/transport" + "go.loglayer.dev/v2" + "go.loglayer.dev/transports/structured/v2" + "go.loglayer.dev/transports/datadog/v2" + "go.loglayer.dev/v2/transport" ) log := loglayer.New(loglayer.Config{ diff --git a/docs/src/logging-api/mocking.md b/docs/src/logging-api/mocking.md index 08eed92..2a7caa6 100644 --- a/docs/src/logging-api/mocking.md +++ b/docs/src/logging-api/mocking.md @@ -18,7 +18,7 @@ LogLayer ships a primitive for each. Use this when logs aren't part of what you're testing. It's a drop-in `*loglayer.LogLayer` backed by a discard transport. Every call is accepted but produces no output. ```go -import "go.loglayer.dev" +import "go.loglayer.dev/v2" func TestSomething(t *testing.T) { log := loglayer.NewMock() @@ -57,8 +57,8 @@ Use this when the test's purpose is to verify *what* was logged. The `transports ```go import ( - "go.loglayer.dev" - lltest "go.loglayer.dev/transports/testing" + "go.loglayer.dev/v2" + lltest "go.loglayer.dev/transports/testing/v2" ) func TestRequestLogging(t *testing.T) { diff --git a/docs/src/plugins/_partials/plugin-list.md b/docs/src/plugins/_partials/plugin-list.md index 1780f08..67b443a 100644 --- a/docs/src/plugins/_partials/plugin-list.md +++ b/docs/src/plugins/_partials/plugin-list.md @@ -2,10 +2,10 @@ | Name | Version | Go Reference | Description | |------|---------|--------------|-------------| -| [Redact](/plugins/redact) | [![Version](https://img.shields.io/github/v/tag/loglayer/loglayer-go?filter=plugins/redact/v*&sort=date&label=version&style=flat-square&color=blue)](https://github.com/loglayer/loglayer-go/releases?q=plugins/redact/&expanded=true) | [![Go Reference](https://pkg.go.dev/badge/go.loglayer.dev/plugins/redact.svg)](https://pkg.go.dev/go.loglayer.dev/plugins/redact) | Replace values for a configured set of keys (and optional regex patterns) before metadata or fields reach a transport. Walks structs, maps, and slices via reflection; preserves the runtime type. | -| [Sampling](/plugins/sampling) | [![Version](https://img.shields.io/github/v/tag/loglayer/loglayer-go?filter=plugins/sampling/v*&sort=date&label=version&style=flat-square&color=blue)](https://github.com/loglayer/loglayer-go/releases?q=plugins/sampling/&expanded=true) | [![Go Reference](https://pkg.go.dev/badge/go.loglayer.dev/plugins/sampling.svg)](https://pkg.go.dev/go.loglayer.dev/plugins/sampling) | Drop a fraction of emissions to keep volume and cost under control. `FixedRate` (per-emission Bernoulli draw), `FixedRatePerLevel` (per-level rate), and `Burst` (rate cap per rolling window). Composes with itself for "1% kept, capped at 100/sec" patterns. | -| [Format Strings](/plugins/fmtlog) | [![Version](https://img.shields.io/github/v/tag/loglayer/loglayer-go?filter=plugins/fmtlog/v*&sort=date&label=version&style=flat-square&color=blue)](https://github.com/loglayer/loglayer-go/releases?q=plugins/fmtlog/&expanded=true) | [![Go Reference](https://pkg.go.dev/badge/go.loglayer.dev/plugins/fmtlog.svg)](https://pkg.go.dev/go.loglayer.dev/plugins/fmtlog) | Opt the logger into `fmt.Sprintf`-style format strings: `log.Info("user %d", id)` resolves to `"user 1234"` before downstream hooks see it. | -| [Datadog APM Trace Injector](/plugins/datadogtrace) | [![Version](https://img.shields.io/github/v/tag/loglayer/loglayer-go?filter=plugins/datadogtrace/v*&sort=date&label=version&style=flat-square&color=blue)](https://github.com/loglayer/loglayer-go/releases?q=plugins/datadogtrace/&expanded=true) | [![Go Reference](https://pkg.go.dev/badge/go.loglayer.dev/plugins/datadogtrace.svg)](https://pkg.go.dev/go.loglayer.dev/plugins/datadogtrace) | Inject the active Datadog APM trace and span IDs (`dd.trace_id`, `dd.span_id`) into every log entry that carries a context, enabling Datadog's log/trace correlation. Tracer-agnostic; bring your own `dd-trace-go` (v1 or v2). | -| [OpenTelemetry Trace Injector](/plugins/oteltrace) | [![Version](https://img.shields.io/github/v/tag/loglayer/loglayer-go?filter=plugins/oteltrace/v*&sort=date&label=version&style=flat-square&color=blue)](https://github.com/loglayer/loglayer-go/releases?q=plugins/oteltrace/&expanded=true) | [![Go Reference](https://pkg.go.dev/badge/go.loglayer.dev/plugins/oteltrace.svg)](https://pkg.go.dev/go.loglayer.dev/plugins/oteltrace) | Inject the active OTel `trace_id` and `span_id` (and optional `trace_flags`) into every log entry that carries a context. Use with non-OTel transports for log/trace correlation; the OTel pipeline does this itself when shipping via `transports/otellog`. | +| [Redact](/plugins/redact) | [![Version](https://img.shields.io/github/v/tag/loglayer/loglayer-go?filter=plugins/redact/v*&sort=date&label=version&style=flat-square&color=blue)](https://github.com/loglayer/loglayer-go/releases?q=plugins/redact/&expanded=true) | [![Go Reference](https://pkg.go.dev/badge/go.loglayer.dev/plugins/redact/v2.svg)](https://pkg.go.dev/go.loglayer.dev/plugins/redact/v2) | Replace values for a configured set of keys (and optional regex patterns) before metadata or fields reach a transport. Walks structs, maps, and slices via reflection; preserves the runtime type. | +| [Sampling](/plugins/sampling) | [![Version](https://img.shields.io/github/v/tag/loglayer/loglayer-go?filter=plugins/sampling/v*&sort=date&label=version&style=flat-square&color=blue)](https://github.com/loglayer/loglayer-go/releases?q=plugins/sampling/&expanded=true) | [![Go Reference](https://pkg.go.dev/badge/go.loglayer.dev/plugins/sampling/v2.svg)](https://pkg.go.dev/go.loglayer.dev/plugins/sampling/v2) | Drop a fraction of emissions to keep volume and cost under control. `FixedRate` (per-emission Bernoulli draw), `FixedRatePerLevel` (per-level rate), and `Burst` (rate cap per rolling window). Composes with itself for "1% kept, capped at 100/sec" patterns. | +| [Format Strings](/plugins/fmtlog) | [![Version](https://img.shields.io/github/v/tag/loglayer/loglayer-go?filter=plugins/fmtlog/v*&sort=date&label=version&style=flat-square&color=blue)](https://github.com/loglayer/loglayer-go/releases?q=plugins/fmtlog/&expanded=true) | [![Go Reference](https://pkg.go.dev/badge/go.loglayer.dev/plugins/fmtlog/v2.svg)](https://pkg.go.dev/go.loglayer.dev/plugins/fmtlog/v2) | Opt the logger into `fmt.Sprintf`-style format strings: `log.Info("user %d", id)` resolves to `"user 1234"` before downstream hooks see it. | +| [Datadog APM Trace Injector](/plugins/datadogtrace) | [![Version](https://img.shields.io/github/v/tag/loglayer/loglayer-go?filter=plugins/datadogtrace/v*&sort=date&label=version&style=flat-square&color=blue)](https://github.com/loglayer/loglayer-go/releases?q=plugins/datadogtrace/&expanded=true) | [![Go Reference](https://pkg.go.dev/badge/go.loglayer.dev/plugins/datadogtrace/v2.svg)](https://pkg.go.dev/go.loglayer.dev/plugins/datadogtrace/v2) | Inject the active Datadog APM trace and span IDs (`dd.trace_id`, `dd.span_id`) into every log entry that carries a context, enabling Datadog's log/trace correlation. Tracer-agnostic; bring your own `dd-trace-go` (v1 or v2). | +| [OpenTelemetry Trace Injector](/plugins/oteltrace) | [![Version](https://img.shields.io/github/v/tag/loglayer/loglayer-go?filter=plugins/oteltrace/v*&sort=date&label=version&style=flat-square&color=blue)](https://github.com/loglayer/loglayer-go/releases?q=plugins/oteltrace/&expanded=true) | [![Go Reference](https://pkg.go.dev/badge/go.loglayer.dev/plugins/oteltrace/v2.svg)](https://pkg.go.dev/go.loglayer.dev/plugins/oteltrace/v2) | Inject the active OTel `trace_id` and `span_id` (and optional `trace_flags`) into every log entry that carries a context. Use with non-OTel transports for log/trace correlation; the OTel pipeline does this itself when shipping via `transports/otellog`. | diff --git a/docs/src/plugins/creating-plugins.md b/docs/src/plugins/creating-plugins.md index 7521a76..2911097 100644 --- a/docs/src/plugins/creating-plugins.md +++ b/docs/src/plugins/creating-plugins.md @@ -5,7 +5,7 @@ description: How to write a LogLayer plugin and which hook to reach for. # Creating Plugins -A plugin is anything that satisfies the [`loglayer.Plugin`](https://pkg.go.dev/go.loglayer.dev#Plugin) interface, plus zero or more hook interfaces for the lifecycle points you want to participate in. +A plugin is anything that satisfies the [`loglayer.Plugin`](https://pkg.go.dev/go.loglayer.dev/v2#Plugin) interface, plus zero or more hook interfaces for the lifecycle points you want to participate in. ```go type Plugin interface { @@ -22,7 +22,7 @@ For the registration API see [Plugin Configuration](/plugins/configuration) and **For single-hook inline plugins** use one of the adapter constructors: ```go -import "go.loglayer.dev" +import "go.loglayer.dev/v2" p := loglayer.NewMessageHook("prefix-msg", func(p loglayer.BeforeMessageOutParams) []any { if len(p.Messages) == 0 { @@ -43,7 +43,7 @@ The full set: `NewFieldsHook`, `NewMetadataHook`, `NewDataHook`, `NewMessageHook ```go package mything -import "go.loglayer.dev" +import "go.loglayer.dev/v2" type Plugin struct { id string @@ -388,10 +388,10 @@ Simple, predictable, no reflection. The downside: a struct with a `Password` fie ### Recipe 2: walk every shape (preserve type) -If your plugin needs to walk structs and nested values (recursively, honoring `json` tags), use [`maputil.Cloner`](https://pkg.go.dev/go.loglayer.dev/utils/maputil#Cloner). It produces a deep clone of any value with replacement predicates applied at any depth, preserving the runtime type. +If your plugin needs to walk structs and nested values (recursively, honoring `json` tags), use [`maputil.Cloner`](https://pkg.go.dev/go.loglayer.dev/v2/utils/maputil#Cloner). It produces a deep clone of any value with replacement predicates applied at any depth, preserving the runtime type. ```go -import "go.loglayer.dev/utils/maputil" +import "go.loglayer.dev/v2/utils/maputil" cloner := &maputil.Cloner{ MatchKey: func(k string) bool { return k == "password" || k == "apiKey" }, @@ -410,10 +410,10 @@ The [`plugins/redact`](/plugins/redact) plugin is built on `Cloner`; [its source ### Recipe 3: normalize to a map first -If the **shape** matters more than preserving the user's runtime type, use [`maputil.ToMap`](https://pkg.go.dev/go.loglayer.dev/utils/maputil#ToMap) to JSON-roundtrip the input, then walk the resulting map. +If the **shape** matters more than preserving the user's runtime type, use [`maputil.ToMap`](https://pkg.go.dev/go.loglayer.dev/v2/utils/maputil#ToMap) to JSON-roundtrip the input, then walk the resulting map. ```go -import "go.loglayer.dev/utils/maputil" +import "go.loglayer.dev/v2/utils/maputil" loglayer.NewMetadataHook("normalize", func(metadata any) any { m := maputil.ToMap(metadata) @@ -465,7 +465,7 @@ Every hook call is wrapped in a deferred recover. If your hook panics, the dispa | `LevelHook` | Level unchanged (`ok=false`) | | `SendGate` | Entry sent to the transport (fails open) | -LogLayer writes a one-line description of the recovered panic to `os.Stderr` so the failure isn't silent. To observe the panic in your own code, implement [`ErrorReporter`](https://pkg.go.dev/go.loglayer.dev#ErrorReporter): +LogLayer writes a one-line description of the recovered panic to `os.Stderr` so the failure isn't silent. To observe the panic in your own code, implement [`ErrorReporter`](https://pkg.go.dev/go.loglayer.dev/v2#ErrorReporter): ```go type ErrorReporter interface { diff --git a/docs/src/plugins/datadogtrace.md b/docs/src/plugins/datadogtrace.md index 5e9cb1a..08f3a4b 100644 --- a/docs/src/plugins/datadogtrace.md +++ b/docs/src/plugins/datadogtrace.md @@ -10,7 +10,7 @@ description: "Inject Datadog APM trace and span IDs into log entries for log/tra `plugins/datadogtrace` adds Datadog's [log/trace correlation](https://docs.datadoghq.com/tracing/other_telemetry/connect_logs_and_traces/) fields to every log entry that carries an active span via `WithContext`. Once your logs ship to Datadog, the UI will link each log line to the trace it originated in. ```sh -go get go.loglayer.dev/plugins/datadogtrace +go get go.loglayer.dev/plugins/datadogtrace/v2 ``` The plugin is **tracer-agnostic**: you wire up a small extractor function that pulls the trace and span IDs from a `context.Context`. This avoids forcing a specific dd-trace-go version (or any tracer dependency at all) on LogLayer's main module; your service already imports the tracer it uses. @@ -27,9 +27,9 @@ import ( ddtracer "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "go.loglayer.dev" - "go.loglayer.dev/plugins/datadogtrace" - "go.loglayer.dev/transports/structured" + "go.loglayer.dev/v2" + "go.loglayer.dev/plugins/datadogtrace/v2" + "go.loglayer.dev/transports/structured/v2" ) func main() { @@ -176,7 +176,7 @@ The plugin is a no-op for log calls without `WithContext`, so untraced logs pay The plugin ships with a live integration test against the real dd-trace-go v2 tracer (using its in-process `mocktracer`). It validates that the documented v2 extractor pattern produces IDs in the decimal-string format Datadog ingestion expects, including for nested spans. -The livetest lives in **its own Go module** at `plugins/datadogtrace/livetest/` so that dd-trace-go's heavy transitive closure (datadog-agent internals, OTel collector pieces, sketches-go, msgp, ...) stays out of the main `go.loglayer.dev` module. Plugin users get the lean main module; livetest contributors get the full SDK they need. +The livetest lives in **its own Go module** at `plugins/datadogtrace/livetest/` so that dd-trace-go's heavy transitive closure (datadog-agent internals, OTel collector pieces, sketches-go, msgp, ...) stays out of the main `go.loglayer.dev/v2` module. Plugin users get the lean main module; livetest contributors get the full SDK they need. Run it from the repo root: diff --git a/docs/src/plugins/fmtlog.md b/docs/src/plugins/fmtlog.md index 81db8f1..b76d078 100644 --- a/docs/src/plugins/fmtlog.md +++ b/docs/src/plugins/fmtlog.md @@ -10,18 +10,18 @@ description: "Opt-in fmt.Sprintf semantics for multi-arg log calls." `fmtlog` is a one-line plugin that opts a logger into `fmt.Sprintf`-style format strings. After registration, every call where the first message is a string and there are extra arguments is rewritten via `fmt.Sprintf(messages[0], messages[1:]...)` before downstream `MessageHook`s run. ```sh -go get go.loglayer.dev/plugins/fmtlog +go get go.loglayer.dev/plugins/fmtlog/v2 ``` -`fmtlog` is its own Go module under `go.loglayer.dev/plugins/fmtlog`, with no third-party dependencies beyond the main `go.loglayer.dev` module it implements `Plugin` against. +`fmtlog` is its own Go module under `go.loglayer.dev/plugins/fmtlog/v2`, with no third-party dependencies beyond the main `go.loglayer.dev/v2` module it implements `Plugin` against. ## Basic Usage ```go import ( - "go.loglayer.dev" - "go.loglayer.dev/plugins/fmtlog" - "go.loglayer.dev/transports/structured" + "go.loglayer.dev/v2" + "go.loglayer.dev/plugins/fmtlog/v2" + "go.loglayer.dev/transports/structured/v2" ) log := loglayer.New(loglayer.Config{ diff --git a/docs/src/plugins/oteltrace.md b/docs/src/plugins/oteltrace.md index 1d4d3d9..7476178 100644 --- a/docs/src/plugins/oteltrace.md +++ b/docs/src/plugins/oteltrace.md @@ -10,11 +10,11 @@ description: "Inject OpenTelemetry trace_id and span_id into log entries for log `plugins/oteltrace` adds the active OpenTelemetry span's `trace_id` and `span_id` to every log entry that carries a `context.Context`. Use it when your service runs OpenTelemetry tracing but ships logs to a destination other than the OTel logs pipeline (structured JSON to stdout, Datadog HTTP intake, Loki, custom transports). ```sh -go get go.loglayer.dev/plugins/oteltrace +go get go.loglayer.dev/plugins/oteltrace/v2 ``` ::: info Separate module -`plugins/oteltrace` ships as its own Go module (`go.loglayer.dev/plugins/oteltrace`) so the OpenTelemetry API's Go-version requirement doesn't bind the main `go.loglayer.dev` module. Requires **Go 1.25+** because that's the floor of `go.opentelemetry.io/otel/trace` and `go.opentelemetry.io/otel/baggage` at current versions. +`plugins/oteltrace` ships as its own Go module (`go.loglayer.dev/plugins/oteltrace/v2`) so the OpenTelemetry API's Go-version requirement doesn't bind the main `go.loglayer.dev/v2` module. Requires **Go 1.25+** because that's the floor of `go.opentelemetry.io/otel/trace` and `go.opentelemetry.io/otel/baggage` at current versions. ::: ::: info When to use this vs `transports/otellog` @@ -27,9 +27,9 @@ go get go.loglayer.dev/plugins/oteltrace ```go import ( - "go.loglayer.dev" - "go.loglayer.dev/plugins/oteltrace" - "go.loglayer.dev/transports/structured" + "go.loglayer.dev/v2" + "go.loglayer.dev/plugins/oteltrace/v2" + "go.loglayer.dev/transports/structured/v2" ) log := loglayer.New(loglayer.Config{ diff --git a/docs/src/plugins/redact.md b/docs/src/plugins/redact.md index 6df3985..6b78ec1 100644 --- a/docs/src/plugins/redact.md +++ b/docs/src/plugins/redact.md @@ -10,7 +10,7 @@ description: "Replace values for sensitive keys, value patterns, or struct field `plugins/redact` replaces sensitive values in metadata and persistent fields before any transport sees them. Useful for keeping secrets, PII, and credentials out of log output without rewriting every call site. ```sh -go get go.loglayer.dev/plugins/redact +go get go.loglayer.dev/plugins/redact/v2 ``` Dependency-free. Pure Go (only `regexp` from stdlib; the walker uses reflection from the standard library). @@ -19,9 +19,9 @@ Dependency-free. Pure Go (only `regexp` from stdlib; the walker uses reflection ```go import ( - "go.loglayer.dev" - "go.loglayer.dev/plugins/redact" - "go.loglayer.dev/transports/structured" + "go.loglayer.dev/v2" + "go.loglayer.dev/plugins/redact/v2" + "go.loglayer.dev/transports/structured/v2" ) log := loglayer.New(loglayer.Config{ diff --git a/docs/src/plugins/sampling.md b/docs/src/plugins/sampling.md index cce7457..e0e9845 100644 --- a/docs/src/plugins/sampling.md +++ b/docs/src/plugins/sampling.md @@ -14,7 +14,7 @@ description: "Drop a fraction of log emissions to keep volume and cost under con - **`Burst(n, window)`**: keep the first N emissions per rolling window, drop the rest. Best for hard caps like "no more than 100 logs/second." ```sh -go get go.loglayer.dev/plugins/sampling +go get go.loglayer.dev/plugins/sampling/v2 ``` Pure Go, no dependencies (uses `math/rand/v2` from the stdlib). @@ -23,9 +23,9 @@ Pure Go, no dependencies (uses `math/rand/v2` from the stdlib). ```go import ( - "go.loglayer.dev" - "go.loglayer.dev/plugins/sampling" - "go.loglayer.dev/transports/structured" + "go.loglayer.dev/v2" + "go.loglayer.dev/plugins/sampling/v2" + "go.loglayer.dev/transports/structured/v2" ) log := loglayer.New(loglayer.Config{ diff --git a/docs/src/plugins/testing-plugins.md b/docs/src/plugins/testing-plugins.md index ea1a2c0..3a02107 100644 --- a/docs/src/plugins/testing-plugins.md +++ b/docs/src/plugins/testing-plugins.md @@ -13,8 +13,8 @@ description: Helpers for testing custom LogLayer plugin implementations. import ( "testing" - "go.loglayer.dev" - "go.loglayer.dev/plugins/plugintest" + "go.loglayer.dev/v2" + "go.loglayer.dev/plugins/plugintest/v2" ) func TestMyPlugin_AddsField(t *testing.T) { @@ -47,7 +47,7 @@ plugintest.AssertNoMutation[any](t, ## Verifying panic recovery -LogLayer recovers hook panics and forwards them to a plugin's `OnError` (when the plugin implements [`loglayer.ErrorReporter`](https://pkg.go.dev/go.loglayer.dev#ErrorReporter)). Use `plugintest.AssertPanicRecovered` to drive a panicking hook and assert that a `*loglayer.RecoveredPanicError` was forwarded. +LogLayer recovers hook panics and forwards them to a plugin's `OnError` (when the plugin implements [`loglayer.ErrorReporter`](https://pkg.go.dev/go.loglayer.dev/v2#ErrorReporter)). Use `plugintest.AssertPanicRecovered` to drive a panicking hook and assert that a `*loglayer.RecoveredPanicError` was forwarded. The helper takes a builder closure that receives a `captureFn`: thread it through to your plugin's `OnError` so the recovery path delivers the panic to the helper's capture. diff --git a/docs/src/public/llms-full.txt b/docs/src/public/llms-full.txt index 932c981..78c7c89 100644 --- a/docs/src/public/llms-full.txt +++ b/docs/src/public/llms-full.txt @@ -1,53 +1,53 @@ # LogLayer for Go: Comprehensive LLM Reference -> Transport-agnostic structured logging for Go. A fluent API on top of zerolog, zap, logrus, phuslu/log, charmbracelet/log, log/slog, OpenTelemetry, or any custom transport. Module path: `go.loglayer.dev`. GitHub: `github.com/loglayer/loglayer-go`. +> Transport-agnostic structured logging for Go. A fluent API on top of zerolog, zap, logrus, phuslu/log, charmbracelet/log, log/slog, OpenTelemetry, or any custom transport. Module path: `go.loglayer.dev/v2`. GitHub: `github.com/loglayer/loglayer-go`. This is the comprehensive reference. For the concise index see [llms.txt](https://go.loglayer.dev/llms.txt). ## Installation ```sh -go get go.loglayer.dev +go get go.loglayer.dev/v2 ``` LogLayer is multi-module: most transports, plugins, and integrations ship as their own Go modules. Install only what you import. ```sh # Renderer transports -go get go.loglayer.dev/transports/structured -go get go.loglayer.dev/transports/console -go get go.loglayer.dev/transports/pretty -go get go.loglayer.dev/transports/testing -go get go.loglayer.dev/transports/blank +go get go.loglayer.dev/transports/structured/v2 +go get go.loglayer.dev/transports/console/v2 +go get go.loglayer.dev/transports/pretty/v2 +go get go.loglayer.dev/transports/testing/v2 +go get go.loglayer.dev/transports/blank/v2 # Wrappers around third-party loggers -go get go.loglayer.dev/transports/zerolog -go get go.loglayer.dev/transports/zap -go get go.loglayer.dev/transports/slog -go get go.loglayer.dev/transports/phuslu -go get go.loglayer.dev/transports/logrus -go get go.loglayer.dev/transports/charmlog +go get go.loglayer.dev/transports/zerolog/v2 +go get go.loglayer.dev/transports/zap/v2 +go get go.loglayer.dev/transports/slog/v2 +go get go.loglayer.dev/transports/phuslu/v2 +go get go.loglayer.dev/transports/logrus/v2 +go get go.loglayer.dev/transports/charmlog/v2 # Cloud (managed log services) -go get go.loglayer.dev/transports/datadog -go get go.loglayer.dev/transports/gcplogging -go get go.loglayer.dev/transports/sentry +go get go.loglayer.dev/transports/datadog/v2 +go get go.loglayer.dev/transports/gcplogging/v2 +go get go.loglayer.dev/transports/sentry/v2 # Other transports -go get go.loglayer.dev/transports/http -go get go.loglayer.dev/transports/lumberjack -go get go.loglayer.dev/transports/otellog +go get go.loglayer.dev/transports/http/v2 +go get go.loglayer.dev/transports/lumberjack/v2 +go get go.loglayer.dev/transports/otellog/v2 # Plugins -go get go.loglayer.dev/plugins/redact -go get go.loglayer.dev/plugins/sampling -go get go.loglayer.dev/plugins/fmtlog -go get go.loglayer.dev/plugins/datadogtrace -go get go.loglayer.dev/plugins/oteltrace +go get go.loglayer.dev/plugins/redact/v2 +go get go.loglayer.dev/plugins/sampling/v2 +go get go.loglayer.dev/plugins/fmtlog/v2 +go get go.loglayer.dev/plugins/datadogtrace/v2 +go get go.loglayer.dev/plugins/oteltrace/v2 # Integrations -go get go.loglayer.dev/integrations/loghttp -go get go.loglayer.dev/integrations/sloghandler +go get go.loglayer.dev/integrations/loghttp/v2 +go get go.loglayer.dev/integrations/sloghandler/v2 ``` The full module list is in [`monorel.toml`](https://github.com/loglayer/loglayer-go/blob/main/monorel.toml). @@ -58,8 +58,8 @@ The full module list is in [`monorel.toml`](https://github.com/loglayer/loglayer package main import ( - "go.loglayer.dev" - "go.loglayer.dev/transports/structured" + "go.loglayer.dev/v2" + "go.loglayer.dev/transports/structured/v2" ) func main() { @@ -579,7 +579,7 @@ type BaseConfig struct { Pattern across all transports: ```go -import "go.loglayer.dev/transport" +import "go.loglayer.dev/v2/transport" structured.New(structured.Config{ BaseConfig: transport.BaseConfig{ID: "main", Level: loglayer.LogLevelInfo}, @@ -594,7 +594,7 @@ structured.New(structured.Config{ Plain text, logfmt-style key/value pairs after the message. Writes to stdout (info/debug) or stderr (warn+) by default. ```go -import "go.loglayer.dev/transports/console" +import "go.loglayer.dev/transports/console/v2" console.New(console.Config{ Writer: os.Stdout, // single writer for all levels @@ -610,7 +610,7 @@ console.New(console.Config{ One JSON object per entry. Recommended for production. ```go -import "go.loglayer.dev/transports/structured" +import "go.loglayer.dev/transports/structured/v2" structured.New(structured.Config{ Writer: os.Stdout, @@ -626,7 +626,7 @@ structured.New(structured.Config{ Colorized terminal output. Theme-aware (Moonlight, Sunlight, Neon, Nature, Pastel) with three view modes (inline, message-only, expanded). ```go -import "go.loglayer.dev/transports/pretty" +import "go.loglayer.dev/transports/pretty/v2" pretty.New(pretty.Config{ Writer: os.Stdout, @@ -641,7 +641,7 @@ pretty.New(pretty.Config{ In-memory capture for assertion tests. ```go -import lltest "go.loglayer.dev/transports/testing" +import lltest "go.loglayer.dev/transports/testing/v2" lib := &lltest.TestLoggingLibrary{} log := loglayer.New(loglayer.Config{ @@ -659,7 +659,7 @@ popped := lib.PopLine() Delegates dispatch to a user-supplied function. For prototyping, metrics counters, message queues. ```go -import "go.loglayer.dev/transports/blank" +import "go.loglayer.dev/transports/blank/v2" blank.New(blank.Config{ BaseConfig: transport.BaseConfig{ID: "metrics"}, @@ -680,7 +680,7 @@ Managed log services. Async + batched; site-aware where applicable. Datadog Logs HTTP intake. Site-aware URL, `DD-API-KEY` header, level→status mapping. Built on the HTTP transport. ```go -import "go.loglayer.dev/transports/datadog" +import "go.loglayer.dev/transports/datadog/v2" tr := datadog.New(datadog.Config{ APIKey: os.Getenv("DD_API_KEY"), // required @@ -703,7 +703,7 @@ Generic shippers and on-disk sinks. Generic batched HTTP POST to any endpoint. Pluggable Encoder. ```go -import httptr "go.loglayer.dev/transports/http" +import httptr "go.loglayer.dev/transports/http/v2" tr := httptr.New(httptr.Config{ URL: "https://logs.example.com/ingest", @@ -724,7 +724,7 @@ defer tr.Close() // flush pending entries One JSON object per log entry written to a rotating file. Render path matches `transports/structured`. Rotation delegated to `lumberjack.v2`. The package name `lumberjack` shadows the upstream `gopkg.in/natefinch/lumberjack.v2`; alias one of them when both are imported. The shorter `transports/file` import path is reserved for a future rolled-our-own implementation. ```go -import "go.loglayer.dev/transports/lumberjack" +import "go.loglayer.dev/transports/lumberjack/v2" tr := lumberjack.New(lumberjack.Config{ Filename: "/var/log/myapp/app.log", // required @@ -752,7 +752,7 @@ Wrap an existing third-party logger so loglayer's API sits on top of your establ ```go import ( zlog "github.com/rs/zerolog" - llzero "go.loglayer.dev/transports/zerolog" + llzero "go.loglayer.dev/transports/zerolog/v2" ) z := zlog.New(os.Stderr).With().Timestamp().Logger() @@ -766,7 +766,7 @@ log := loglayer.New(loglayer.Config{ ```go import ( "go.uber.org/zap" - llzap "go.loglayer.dev/transports/zap" + llzap "go.loglayer.dev/transports/zap/v2" ) z, _ := zap.NewProduction() @@ -782,7 +782,7 @@ Fatal-level entries are written through a custom hook that prevents zap's defaul ```go import ( "log/slog" - llslog "go.loglayer.dev/transports/slog" + llslog "go.loglayer.dev/transports/slog/v2" ) handler := slog.NewJSONHandler(os.Stderr, nil) @@ -803,7 +803,7 @@ Same wrapping pattern; see [transports overview](https://go.loglayer.dev/transpo Emits each entry as an OTel `log.Record` on a `go.opentelemetry.io/otel/log.Logger`. ```go -import "go.loglayer.dev/transports/otellog" +import "go.loglayer.dev/transports/otellog/v2" tr := otellog.New(otellog.Config{ Name: "checkout-api", // instrumentation scope name @@ -824,7 +824,7 @@ import ( "cloud.google.com/go/logging" - "go.loglayer.dev/transports/gcplogging" + "go.loglayer.dev/transports/gcplogging/v2" ) ctx := context.Background() @@ -850,7 +850,7 @@ Forwards each entry to a caller-supplied `sentry.Logger` (Sentry's structured-lo import ( "github.com/getsentry/sentry-go" - sentrytransport "go.loglayer.dev/transports/sentry" + sentrytransport "go.loglayer.dev/transports/sentry/v2" ) sentry.Init(sentry.ClientOptions{Dsn: "...", EnableLogs: true}) @@ -934,7 +934,7 @@ log.PluginCount() ### Redact Plugin ```go -import "go.loglayer.dev/plugins/redact" +import "go.loglayer.dev/plugins/redact/v2" log.AddPlugin(redact.New(redact.Config{ Keys: []string{"password", "apiKey", "ssn"}, @@ -948,7 +948,7 @@ Walks structs, maps, slices, and pointers via reflection at any depth; preserves ### Sampling Plugin ```go -import "go.loglayer.dev/plugins/sampling" +import "go.loglayer.dev/plugins/sampling/v2" // Independent Bernoulli draw per emission log.AddPlugin(sampling.FixedRate(0.01)) // 1% kept @@ -970,7 +970,7 @@ log.AddPlugin(sampling.Burst(100, time.Second)) Opt the logger into `fmt.Sprintf` semantics for multi-arg messages. ```go -import "go.loglayer.dev/plugins/fmtlog" +import "go.loglayer.dev/plugins/fmtlog/v2" log.AddPlugin(fmtlog.New()) log.Info("user %d logged in from %s", 42, "1.2.3.4") @@ -984,7 +984,7 @@ Tracer-agnostic — supply a small `Extract` function for your tracer (dd-trace- ```go import ( ddtracer "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" - "go.loglayer.dev/plugins/datadogtrace" + "go.loglayer.dev/plugins/datadogtrace/v2" ) log.AddPlugin(datadogtrace.New(datadogtrace.Config{ @@ -1011,7 +1011,7 @@ log.WithContext(r.Context()).Info("served") Inject `trace_id`, `span_id`, optional `trace_flags`, W3C `trace_state`, and W3C baggage members. ```go -import "go.loglayer.dev/plugins/oteltrace" +import "go.loglayer.dev/plugins/oteltrace/v2" log.AddPlugin(oteltrace.New(oteltrace.Config{ TraceIDKey: "trace_id", // default @@ -1029,7 +1029,7 @@ Baggage rides independently of the span — contexts with baggage but no span st ### loghttp (HTTP middleware) ```go -import "go.loglayer.dev/integrations/loghttp" +import "go.loglayer.dev/integrations/loghttp/v2" mux := http.NewServeMux() handler := loghttp.Middleware(log, loghttp.Config{})(mux) @@ -1049,7 +1049,7 @@ Auto-emits a "request completed" log on response with status, bytes written, dur ```go import ( "log/slog" - "go.loglayer.dev/integrations/sloghandler" + "go.loglayer.dev/integrations/sloghandler/v2" ) slog.SetDefault(slog.New(sloghandler.New(log))) @@ -1072,7 +1072,7 @@ log.Info("invisible") ### Capture entries with lltest ```go -import lltest "go.loglayer.dev/transports/testing" +import lltest "go.loglayer.dev/transports/testing/v2" lib := &lltest.TestLoggingLibrary{} log := loglayer.New(loglayer.Config{Transport: lltest.New(lltest.Config{Library: lib})}) @@ -1087,7 +1087,7 @@ lines := lib.Lines() // []lltest.LogLine ### Plugin testing helpers ```go -import "go.loglayer.dev/plugins/plugintest" +import "go.loglayer.dev/plugins/plugintest/v2" // Wires plugin into a logger backed by lltest, returns the lib for assertions log, lib := plugintest.Install(t, redact.New(redact.Config{Keys: []string{"pw"}})) @@ -1108,7 +1108,7 @@ require.Equal(t, "[REDACTED]", md["pw"]) ## Multi-Module Versioning -`go.loglayer.dev` is the main module; every transport, plugin, and integration ships as its own Go module. Tags use the prefix form (`transports//v`, `plugins//v`). A breaking change in any one sub-module bumps only that sub-module's major version — `go.loglayer.dev`'s import path stays stable. +`go.loglayer.dev/v2` is the main module; every transport, plugin, and integration ships as its own Go module. Tags use the prefix form (`transports//v`, `plugins//v`). A breaking change in any one sub-module bumps only that sub-module's major version — `go.loglayer.dev/v2`'s import path stays stable. Full module list: [`monorel.toml`](https://github.com/loglayer/loglayer-go/blob/main/monorel.toml). diff --git a/docs/src/public/llms.txt b/docs/src/public/llms.txt index 876a34e..73bf21d 100644 --- a/docs/src/public/llms.txt +++ b/docs/src/public/llms.txt @@ -1,19 +1,19 @@ # LogLayer for Go -> Transport-agnostic structured logging for Go. A fluent API on top of zerolog, zap, logrus, phuslu/log, charmbracelet/log, log/slog, OpenTelemetry, or any custom transport. Module path: `go.loglayer.dev`. GitHub: `github.com/loglayer/loglayer-go`. +> Transport-agnostic structured logging for Go. A fluent API on top of zerolog, zap, logrus, phuslu/log, charmbracelet/log, log/slog, OpenTelemetry, or any custom transport. Module path: `go.loglayer.dev/v2`. GitHub: `github.com/loglayer/loglayer-go`. ## Installation ```sh -go get go.loglayer.dev +go get go.loglayer.dev/v2 ``` Most transports and plugins ship as their own modules — install only what you import: ```sh -go get go.loglayer.dev/transports/structured -go get go.loglayer.dev/transports/zerolog -go get go.loglayer.dev/plugins/redact +go get go.loglayer.dev/transports/structured/v2 +go get go.loglayer.dev/transports/zerolog/v2 +go get go.loglayer.dev/plugins/redact/v2 ``` ## Quick Start @@ -22,8 +22,8 @@ go get go.loglayer.dev/plugins/redact package main import ( - "go.loglayer.dev" - "go.loglayer.dev/transports/structured" + "go.loglayer.dev/v2" + "go.loglayer.dev/transports/structured/v2" ) func main() { @@ -338,7 +338,7 @@ The slog handler (`integrations/sloghandler`) forwards `slog.Record.PC` automati log := loglayer.NewMock() // Capture entries for assertion -import lltest "go.loglayer.dev/transports/testing" +import lltest "go.loglayer.dev/transports/testing/v2" lib := &lltest.TestLoggingLibrary{} log := loglayer.New(loglayer.Config{ @@ -401,7 +401,7 @@ lines := lib.Lines() // []lltest.LogLine — assert on Level, Messages, Data, M - [Mocking](https://go.loglayer.dev/logging-api/mocking): `loglayer.NewMock()` and `transports/testing` - [Transport Overview](https://go.loglayer.dev/transports/): All transports - [Plugins Overview](https://go.loglayer.dev/plugins/): Plugin system and hooks -- [For TypeScript Developers](https://go.loglayer.dev/for-typescript-developers): API mapping from `loglayer` (TS) to `go.loglayer.dev` +- [For TypeScript Developers](https://go.loglayer.dev/for-typescript-developers): API mapping from `loglayer` (TS) to `go.loglayer.dev/v2` ## Optional diff --git a/docs/src/transports/_partials/transport-list.md b/docs/src/transports/_partials/transport-list.md index 8bfe811..528b0ce 100644 --- a/docs/src/transports/_partials/transport-list.md +++ b/docs/src/transports/_partials/transport-list.md @@ -6,12 +6,12 @@ Self-contained transports that format the entry and write it to an `io.Writer`. | Name | Version | Go Reference | Description | |------|---------|--------------|-------------| -| [Pretty](/transports/pretty) | [![Version](https://img.shields.io/github/v/tag/loglayer/loglayer-go?filter=transports/pretty/v*&sort=date&label=version&style=flat-square&color=blue)](https://github.com/loglayer/loglayer-go/releases?q=transports/pretty/&expanded=true) | [![Go Reference](https://pkg.go.dev/badge/go.loglayer.dev/transports/pretty.svg)](https://pkg.go.dev/go.loglayer.dev/transports/pretty) | Colorized, theme-aware terminal output. **Recommended for local dev.** | -| [Structured](/transports/structured) | [![Version](https://img.shields.io/github/v/tag/loglayer/loglayer-go?filter=transports/structured/v*&sort=date&label=version&style=flat-square&color=blue)](https://github.com/loglayer/loglayer-go/releases?q=transports/structured/&expanded=true) | [![Go Reference](https://pkg.go.dev/badge/go.loglayer.dev/transports/structured.svg)](https://pkg.go.dev/go.loglayer.dev/transports/structured) | One JSON object per log entry. Recommended for production. | -| [Console](/transports/console) | [![Version](https://img.shields.io/github/v/tag/loglayer/loglayer-go?filter=transports/console/v*&sort=date&label=version&style=flat-square&color=blue)](https://github.com/loglayer/loglayer-go/releases?q=transports/console/&expanded=true) | [![Go Reference](https://pkg.go.dev/badge/go.loglayer.dev/transports/console.svg)](https://pkg.go.dev/go.loglayer.dev/transports/console) | Plain `fmt.Println`-style output to stdout/stderr; minimal formatting. | -| [CLI](/transports/cli) | [![Version](https://img.shields.io/github/v/tag/loglayer/loglayer-go?filter=transports/cli/v*&sort=date&label=version&style=flat-square&color=blue)](https://github.com/loglayer/loglayer-go/releases?q=transports/cli/&expanded=true) | [![Go Reference](https://pkg.go.dev/badge/go.loglayer.dev/transports/cli.svg)](https://pkg.go.dev/go.loglayer.dev/transports/cli) | Tuned for CLI apps: short level prefixes, stdout/stderr routing, TTY-detected color, no timestamps. | -| [Testing](/transports/testing) | [![Version](https://img.shields.io/github/v/tag/loglayer/loglayer-go?filter=transports/testing/v*&sort=date&label=version&style=flat-square&color=blue)](https://github.com/loglayer/loglayer-go/releases?q=transports/testing/&expanded=true) | [![Go Reference](https://pkg.go.dev/badge/go.loglayer.dev/transports/testing.svg)](https://pkg.go.dev/go.loglayer.dev/transports/testing) | Captures entries in memory for tests. | -| [Blank](/transports/blank) | [![Version](https://img.shields.io/github/v/tag/loglayer/loglayer-go?filter=transports/blank/v*&sort=date&label=version&style=flat-square&color=blue)](https://github.com/loglayer/loglayer-go/releases?q=transports/blank/&expanded=true) | [![Go Reference](https://pkg.go.dev/badge/go.loglayer.dev/transports/blank.svg)](https://pkg.go.dev/go.loglayer.dev/transports/blank) | Delegates dispatch to a user-supplied function. For prototyping or one-off integrations. | +| [Pretty](/transports/pretty) | [![Version](https://img.shields.io/github/v/tag/loglayer/loglayer-go?filter=transports/pretty/v*&sort=date&label=version&style=flat-square&color=blue)](https://github.com/loglayer/loglayer-go/releases?q=transports/pretty/&expanded=true) | [![Go Reference](https://pkg.go.dev/badge/go.loglayer.dev/transports/pretty/v2.svg)](https://pkg.go.dev/go.loglayer.dev/transports/pretty/v2) | Colorized, theme-aware terminal output. **Recommended for local dev.** | +| [Structured](/transports/structured) | [![Version](https://img.shields.io/github/v/tag/loglayer/loglayer-go?filter=transports/structured/v*&sort=date&label=version&style=flat-square&color=blue)](https://github.com/loglayer/loglayer-go/releases?q=transports/structured/&expanded=true) | [![Go Reference](https://pkg.go.dev/badge/go.loglayer.dev/transports/structured/v2.svg)](https://pkg.go.dev/go.loglayer.dev/transports/structured/v2) | One JSON object per log entry. Recommended for production. | +| [Console](/transports/console) | [![Version](https://img.shields.io/github/v/tag/loglayer/loglayer-go?filter=transports/console/v*&sort=date&label=version&style=flat-square&color=blue)](https://github.com/loglayer/loglayer-go/releases?q=transports/console/&expanded=true) | [![Go Reference](https://pkg.go.dev/badge/go.loglayer.dev/transports/console/v2.svg)](https://pkg.go.dev/go.loglayer.dev/transports/console/v2) | Plain `fmt.Println`-style output to stdout/stderr; minimal formatting. | +| [CLI](/transports/cli) | [![Version](https://img.shields.io/github/v/tag/loglayer/loglayer-go?filter=transports/cli/v*&sort=date&label=version&style=flat-square&color=blue)](https://github.com/loglayer/loglayer-go/releases?q=transports/cli/&expanded=true) | [![Go Reference](https://pkg.go.dev/badge/go.loglayer.dev/transports/cli/v2.svg)](https://pkg.go.dev/go.loglayer.dev/transports/cli/v2) | Tuned for CLI apps: short level prefixes, stdout/stderr routing, TTY-detected color, no timestamps. | +| [Testing](/transports/testing) | [![Version](https://img.shields.io/github/v/tag/loglayer/loglayer-go?filter=transports/testing/v*&sort=date&label=version&style=flat-square&color=blue)](https://github.com/loglayer/loglayer-go/releases?q=transports/testing/&expanded=true) | [![Go Reference](https://pkg.go.dev/badge/go.loglayer.dev/transports/testing/v2.svg)](https://pkg.go.dev/go.loglayer.dev/transports/testing/v2) | Captures entries in memory for tests. | +| [Blank](/transports/blank) | [![Version](https://img.shields.io/github/v/tag/loglayer/loglayer-go?filter=transports/blank/v*&sort=date&label=version&style=flat-square&color=blue)](https://github.com/loglayer/loglayer-go/releases?q=transports/blank/&expanded=true) | [![Go Reference](https://pkg.go.dev/badge/go.loglayer.dev/transports/blank/v2.svg)](https://pkg.go.dev/go.loglayer.dev/transports/blank/v2) | Delegates dispatch to a user-supplied function. For prototyping or one-off integrations. | @@ -23,9 +23,9 @@ Managed log services. Async + batched by default; site-aware where applicable. | Name | Version | Go Reference | Description | |------|---------|--------------|-------------| -| [Datadog](/transports/datadog) | [![Version](https://img.shields.io/github/v/tag/loglayer/loglayer-go?filter=transports/datadog/v*&sort=date&label=version&style=flat-square&color=blue)](https://github.com/loglayer/loglayer-go/releases?q=transports/datadog/&expanded=true) | [![Go Reference](https://pkg.go.dev/badge/go.loglayer.dev/transports/datadog.svg)](https://pkg.go.dev/go.loglayer.dev/transports/datadog) | Datadog Logs HTTP intake. Site-aware URL, DD-API-KEY header, status mapping. | -| [Google Cloud Logging](/transports/gcplogging) | [![Version](https://img.shields.io/github/v/tag/loglayer/loglayer-go?filter=transports/gcplogging/v*&sort=date&label=version&style=flat-square&color=blue)](https://github.com/loglayer/loglayer-go/releases?q=transports/gcplogging/&expanded=true) | [![Go Reference](https://pkg.go.dev/badge/go.loglayer.dev/transports/gcplogging.svg)](https://pkg.go.dev/go.loglayer.dev/transports/gcplogging) | Forwards entries to a caller-supplied `*logging.Logger` from `cloud.google.com/go/logging`. Severity mapping, root-level Entry skeleton, async + sync dispatch. | -| [Sentry](/transports/sentry) | [![Version](https://img.shields.io/github/v/tag/loglayer/loglayer-go?filter=transports/sentry/v*&sort=date&label=version&style=flat-square&color=blue)](https://github.com/loglayer/loglayer-go/releases?q=transports/sentry/&expanded=true) | [![Go Reference](https://pkg.go.dev/badge/go.loglayer.dev/transports/sentry.svg)](https://pkg.go.dev/go.loglayer.dev/transports/sentry) | Forwards entries to a `sentry.Logger`. Routes fatal/panic through `LFatal` so loglayer's core controls termination. | +| [Datadog](/transports/datadog) | [![Version](https://img.shields.io/github/v/tag/loglayer/loglayer-go?filter=transports/datadog/v*&sort=date&label=version&style=flat-square&color=blue)](https://github.com/loglayer/loglayer-go/releases?q=transports/datadog/&expanded=true) | [![Go Reference](https://pkg.go.dev/badge/go.loglayer.dev/transports/datadog/v2.svg)](https://pkg.go.dev/go.loglayer.dev/transports/datadog/v2) | Datadog Logs HTTP intake. Site-aware URL, DD-API-KEY header, status mapping. | +| [Google Cloud Logging](/transports/gcplogging) | [![Version](https://img.shields.io/github/v/tag/loglayer/loglayer-go?filter=transports/gcplogging/v*&sort=date&label=version&style=flat-square&color=blue)](https://github.com/loglayer/loglayer-go/releases?q=transports/gcplogging/&expanded=true) | [![Go Reference](https://pkg.go.dev/badge/go.loglayer.dev/transports/gcplogging/v2.svg)](https://pkg.go.dev/go.loglayer.dev/transports/gcplogging/v2) | Forwards entries to a caller-supplied `*logging.Logger` from `cloud.google.com/go/logging`. Severity mapping, root-level Entry skeleton, async + sync dispatch. | +| [Sentry](/transports/sentry) | [![Version](https://img.shields.io/github/v/tag/loglayer/loglayer-go?filter=transports/sentry/v*&sort=date&label=version&style=flat-square&color=blue)](https://github.com/loglayer/loglayer-go/releases?q=transports/sentry/&expanded=true) | [![Go Reference](https://pkg.go.dev/badge/go.loglayer.dev/transports/sentry/v2.svg)](https://pkg.go.dev/go.loglayer.dev/transports/sentry/v2) | Forwards entries to a `sentry.Logger`. Routes fatal/panic through `LFatal` so loglayer's core controls termination. | @@ -37,9 +37,9 @@ Generic shippers and on-disk sinks. | Name | Version | Go Reference | Description | |------|---------|--------------|-------------| -| [HTTP](/transports/http) | [![Version](https://img.shields.io/github/v/tag/loglayer/loglayer-go?filter=transports/http/v*&sort=date&label=version&style=flat-square&color=blue)](https://github.com/loglayer/loglayer-go/releases?q=transports/http/&expanded=true) | [![Go Reference](https://pkg.go.dev/badge/go.loglayer.dev/transports/http.svg)](https://pkg.go.dev/go.loglayer.dev/transports/http) | Generic batched HTTP POST to any endpoint. Pluggable Encoder. | -| [File (Lumberjack)](/transports/lumberjack) | [![Version](https://img.shields.io/github/v/tag/loglayer/loglayer-go?filter=transports/lumberjack/v*&sort=date&label=version&style=flat-square&color=blue)](https://github.com/loglayer/loglayer-go/releases?q=transports/lumberjack/&expanded=true) | [![Go Reference](https://pkg.go.dev/badge/go.loglayer.dev/transports/lumberjack.svg)](https://pkg.go.dev/go.loglayer.dev/transports/lumberjack) | One JSON object per line written to a rotating file. Backed by `lumberjack.v2`. | -| [OpenTelemetry Logs](/transports/otellog) | [![Version](https://img.shields.io/github/v/tag/loglayer/loglayer-go?filter=transports/otellog/v*&sort=date&label=version&style=flat-square&color=blue)](https://github.com/loglayer/loglayer-go/releases?q=transports/otellog/&expanded=true) | [![Go Reference](https://pkg.go.dev/badge/go.loglayer.dev/transports/otellog.svg)](https://pkg.go.dev/go.loglayer.dev/transports/otellog) | Emits to an OTel `log.Logger`. Forwards `WithContext` so SDK processors can correlate with the active span. | +| [HTTP](/transports/http) | [![Version](https://img.shields.io/github/v/tag/loglayer/loglayer-go?filter=transports/http/v*&sort=date&label=version&style=flat-square&color=blue)](https://github.com/loglayer/loglayer-go/releases?q=transports/http/&expanded=true) | [![Go Reference](https://pkg.go.dev/badge/go.loglayer.dev/transports/http/v2.svg)](https://pkg.go.dev/go.loglayer.dev/transports/http/v2) | Generic batched HTTP POST to any endpoint. Pluggable Encoder. | +| [File (Lumberjack)](/transports/lumberjack) | [![Version](https://img.shields.io/github/v/tag/loglayer/loglayer-go?filter=transports/lumberjack/v*&sort=date&label=version&style=flat-square&color=blue)](https://github.com/loglayer/loglayer-go/releases?q=transports/lumberjack/&expanded=true) | [![Go Reference](https://pkg.go.dev/badge/go.loglayer.dev/transports/lumberjack/v2.svg)](https://pkg.go.dev/go.loglayer.dev/transports/lumberjack/v2) | One JSON object per line written to a rotating file. Backed by `lumberjack.v2`. | +| [OpenTelemetry Logs](/transports/otellog) | [![Version](https://img.shields.io/github/v/tag/loglayer/loglayer-go?filter=transports/otellog/v*&sort=date&label=version&style=flat-square&color=blue)](https://github.com/loglayer/loglayer-go/releases?q=transports/otellog/&expanded=true) | [![Go Reference](https://pkg.go.dev/badge/go.loglayer.dev/transports/otellog/v2.svg)](https://pkg.go.dev/go.loglayer.dev/transports/otellog/v2) | Emits to an OTel `log.Logger`. Forwards `WithContext` so SDK processors can correlate with the active span. | @@ -51,11 +51,11 @@ Transports that hand the entry off to an existing third-party logger you already | Name | Version | Go Reference | Description | |------|---------|--------------|-------------| -| [Zerolog](/transports/zerolog) | [![Version](https://img.shields.io/github/v/tag/loglayer/loglayer-go?filter=transports/zerolog/v*&sort=date&label=version&style=flat-square&color=blue)](https://github.com/loglayer/loglayer-go/releases?q=transports/zerolog/&expanded=true) | [![Go Reference](https://pkg.go.dev/badge/go.loglayer.dev/transports/zerolog.svg)](https://pkg.go.dev/go.loglayer.dev/transports/zerolog) | Wraps a `*zerolog.Logger` | -| [Zap](/transports/zap) | [![Version](https://img.shields.io/github/v/tag/loglayer/loglayer-go?filter=transports/zap/v*&sort=date&label=version&style=flat-square&color=blue)](https://github.com/loglayer/loglayer-go/releases?q=transports/zap/&expanded=true) | [![Go Reference](https://pkg.go.dev/badge/go.loglayer.dev/transports/zap.svg)](https://pkg.go.dev/go.loglayer.dev/transports/zap) | Wraps a `*zap.Logger` | -| [log/slog](/transports/slog) | [![Version](https://img.shields.io/github/v/tag/loglayer/loglayer-go?filter=transports/slog/v*&sort=date&label=version&style=flat-square&color=blue)](https://github.com/loglayer/loglayer-go/releases?q=transports/slog/&expanded=true) | [![Go Reference](https://pkg.go.dev/badge/go.loglayer.dev/transports/slog.svg)](https://pkg.go.dev/go.loglayer.dev/transports/slog) | Wraps a stdlib `*slog.Logger`. Forwards `WithContext` to handlers. | -| [phuslu/log](/transports/phuslu) | [![Version](https://img.shields.io/github/v/tag/loglayer/loglayer-go?filter=transports/phuslu/v*&sort=date&label=version&style=flat-square&color=blue)](https://github.com/loglayer/loglayer-go/releases?q=transports/phuslu/&expanded=true) | [![Go Reference](https://pkg.go.dev/badge/go.loglayer.dev/transports/phuslu.svg)](https://pkg.go.dev/go.loglayer.dev/transports/phuslu) | High-performance zero-alloc JSON logger. Always exits on fatal. | -| [logrus](/transports/logrus) | [![Version](https://img.shields.io/github/v/tag/loglayer/loglayer-go?filter=transports/logrus/v*&sort=date&label=version&style=flat-square&color=blue)](https://github.com/loglayer/loglayer-go/releases?q=transports/logrus/&expanded=true) | [![Go Reference](https://pkg.go.dev/badge/go.loglayer.dev/transports/logrus.svg)](https://pkg.go.dev/go.loglayer.dev/transports/logrus) | The classic structured logger | -| [charmbracelet/log](/transports/charmlog) | [![Version](https://img.shields.io/github/v/tag/loglayer/loglayer-go?filter=transports/charmlog/v*&sort=date&label=version&style=flat-square&color=blue)](https://github.com/loglayer/loglayer-go/releases?q=transports/charmlog/&expanded=true) | [![Go Reference](https://pkg.go.dev/badge/go.loglayer.dev/transports/charmlog.svg)](https://pkg.go.dev/go.loglayer.dev/transports/charmlog) | Pretty terminal-friendly logger from Charm | +| [Zerolog](/transports/zerolog) | [![Version](https://img.shields.io/github/v/tag/loglayer/loglayer-go?filter=transports/zerolog/v*&sort=date&label=version&style=flat-square&color=blue)](https://github.com/loglayer/loglayer-go/releases?q=transports/zerolog/&expanded=true) | [![Go Reference](https://pkg.go.dev/badge/go.loglayer.dev/transports/zerolog/v2.svg)](https://pkg.go.dev/go.loglayer.dev/transports/zerolog/v2) | Wraps a `*zerolog.Logger` | +| [Zap](/transports/zap) | [![Version](https://img.shields.io/github/v/tag/loglayer/loglayer-go?filter=transports/zap/v*&sort=date&label=version&style=flat-square&color=blue)](https://github.com/loglayer/loglayer-go/releases?q=transports/zap/&expanded=true) | [![Go Reference](https://pkg.go.dev/badge/go.loglayer.dev/transports/zap/v2.svg)](https://pkg.go.dev/go.loglayer.dev/transports/zap/v2) | Wraps a `*zap.Logger` | +| [log/slog](/transports/slog) | [![Version](https://img.shields.io/github/v/tag/loglayer/loglayer-go?filter=transports/slog/v*&sort=date&label=version&style=flat-square&color=blue)](https://github.com/loglayer/loglayer-go/releases?q=transports/slog/&expanded=true) | [![Go Reference](https://pkg.go.dev/badge/go.loglayer.dev/transports/slog/v2.svg)](https://pkg.go.dev/go.loglayer.dev/transports/slog/v2) | Wraps a stdlib `*slog.Logger`. Forwards `WithContext` to handlers. | +| [phuslu/log](/transports/phuslu) | [![Version](https://img.shields.io/github/v/tag/loglayer/loglayer-go?filter=transports/phuslu/v*&sort=date&label=version&style=flat-square&color=blue)](https://github.com/loglayer/loglayer-go/releases?q=transports/phuslu/&expanded=true) | [![Go Reference](https://pkg.go.dev/badge/go.loglayer.dev/transports/phuslu/v2.svg)](https://pkg.go.dev/go.loglayer.dev/transports/phuslu/v2) | High-performance zero-alloc JSON logger. Always exits on fatal. | +| [logrus](/transports/logrus) | [![Version](https://img.shields.io/github/v/tag/loglayer/loglayer-go?filter=transports/logrus/v*&sort=date&label=version&style=flat-square&color=blue)](https://github.com/loglayer/loglayer-go/releases?q=transports/logrus/&expanded=true) | [![Go Reference](https://pkg.go.dev/badge/go.loglayer.dev/transports/logrus/v2.svg)](https://pkg.go.dev/go.loglayer.dev/transports/logrus/v2) | The classic structured logger | +| [charmbracelet/log](/transports/charmlog) | [![Version](https://img.shields.io/github/v/tag/loglayer/loglayer-go?filter=transports/charmlog/v*&sort=date&label=version&style=flat-square&color=blue)](https://github.com/loglayer/loglayer-go/releases?q=transports/charmlog/&expanded=true) | [![Go Reference](https://pkg.go.dev/badge/go.loglayer.dev/transports/charmlog/v2.svg)](https://pkg.go.dev/go.loglayer.dev/transports/charmlog/v2) | Pretty terminal-friendly logger from Charm | diff --git a/docs/src/transports/blank.md b/docs/src/transports/blank.md index ff04fd9..19c8053 100644 --- a/docs/src/transports/blank.md +++ b/docs/src/transports/blank.md @@ -16,16 +16,16 @@ The `blank` transport delegates `SendToLogger` to a function you supply inline. If you find yourself repeating the same `blank.Config` across the codebase, promote it to its own transport package using the [Creating Transports](/transports/creating-transports) template. ```sh -go get go.loglayer.dev/transports/blank +go get go.loglayer.dev/transports/blank/v2 ``` ## Basic Usage ```go import ( - "go.loglayer.dev" - "go.loglayer.dev/transport" - "go.loglayer.dev/transports/blank" + "go.loglayer.dev/v2" + "go.loglayer.dev/v2/transport" + "go.loglayer.dev/transports/blank/v2" ) log := loglayer.New(loglayer.Config{ diff --git a/docs/src/transports/charmlog.md b/docs/src/transports/charmlog.md index 5bf1867..3f34fcc 100644 --- a/docs/src/transports/charmlog.md +++ b/docs/src/transports/charmlog.md @@ -10,7 +10,7 @@ description: Wrap a github.com/charmbracelet/log logger with LogLayer. Wraps an existing `*charmbracelet/log.Logger`. Map metadata flattens to alternating key/value pairs; struct metadata lands under a configurable key. ```sh -go get go.loglayer.dev/transports/charmlog +go get go.loglayer.dev/transports/charmlog/v2 go get github.com/charmbracelet/log ``` @@ -24,8 +24,8 @@ import ( clog "github.com/charmbracelet/log" - "go.loglayer.dev" - llcharm "go.loglayer.dev/transports/charmlog" + "go.loglayer.dev/v2" + llcharm "go.loglayer.dev/transports/charmlog/v2" ) cl := clog.NewWithOptions(os.Stderr, clog.Options{ diff --git a/docs/src/transports/cli.md b/docs/src/transports/cli.md index 9f56e01..1f63832 100644 --- a/docs/src/transports/cli.md +++ b/docs/src/transports/cli.md @@ -17,15 +17,15 @@ The `cli` transport renders log entries as plain user-facing CLI output. The clo - **Table rendering for slice metadata.** Pass `[]loglayer.Metadata`, `[]SomeStruct`, or any other slice of map-shaped or struct-shaped values to `WithMetadata` / `MetadataOnly` and the transport renders a tabwriter-aligned table after the message. Same call site emits a proper JSON array when paired with the [structured](/transports/structured) transport. See [Table Rendering for Slice-of-Map Metadata](#table-rendering-for-slice-of-map-metadata) below. ```sh -go get go.loglayer.dev/transports/cli +go get go.loglayer.dev/transports/cli/v2 ``` ## Basic Usage ```go import ( - "go.loglayer.dev" - cli "go.loglayer.dev/transports/cli" + "go.loglayer.dev/v2" + cli "go.loglayer.dev/transports/cli/v2" ) log := loglayer.New(loglayer.Config{ @@ -138,8 +138,8 @@ The standard CLI shape is to wire `-v` flags to loglayer's level state and `-vv` ```go import ( - "go.loglayer.dev" - cli "go.loglayer.dev/transports/cli" + "go.loglayer.dev/v2" + cli "go.loglayer.dev/transports/cli/v2" ) func newLogger(verbosity int) *loglayer.LogLayer { @@ -191,7 +191,7 @@ Note that the TTY check is against `Stdout`, not `Stderr`: piping stdout to a fi Without a plugin, multi-argument log calls are space-joined: `log.Info("count:", n)` renders as `"count: 1234"`. CLI output usually wants format-string semantics: ```go -import "go.loglayer.dev/plugins/fmtlog" +import "go.loglayer.dev/plugins/fmtlog/v2" log := loglayer.New(loglayer.Config{ Transport: cli.New(cli.Config{}), @@ -202,11 +202,11 @@ log.Info("Applied %d release(s) at %s:", count, sha) log.Error("connecting to %s: %v", host, err) ``` -The plugin registers a single MessageHook that rewrites `[]any{format, args...}` to `[]any{fmt.Sprintf(format, args...)}`. Zero hot-path cost when a call has a single message; one Sprintf when there are extras. See [fmtlog](https://pkg.go.dev/go.loglayer.dev/plugins/fmtlog) for the full API. +The plugin registers a single MessageHook that rewrites `[]any{format, args...}` to `[]any{fmt.Sprintf(format, args...)}`. Zero hot-path cost when a call has a single message; one Sprintf when there are extras. See [fmtlog](https://pkg.go.dev/go.loglayer.dev/plugins/fmtlog/v2) for the full API. ### `redact` for token scrubbing -If your CLI ever logs values that might include `GITHUB_TOKEN`, `GITLAB_TOKEN`, or other secrets via `WithMetadata`, pair with the [redact](https://pkg.go.dev/go.loglayer.dev/plugins/redact) plugin. ANSI / CRLF sanitization is already on the table-cell and logfmt-value paths in this transport; the redact plugin closes the value-content side (token patterns, key allow / deny lists). +If your CLI ever logs values that might include `GITHUB_TOKEN`, `GITLAB_TOKEN`, or other secrets via `WithMetadata`, pair with the [redact](https://pkg.go.dev/go.loglayer.dev/plugins/redact/v2) plugin. ANSI / CRLF sanitization is already on the table-cell and logfmt-value paths in this transport; the redact plugin closes the value-content side (token patterns, key allow / deny lists). ## Switching to JSON for `--json` @@ -214,9 +214,9 @@ For machine-readable output, swap `cli` for [structured](/transports/structured) ```go import ( - "go.loglayer.dev" - cli "go.loglayer.dev/transports/cli" - "go.loglayer.dev/transports/structured" + "go.loglayer.dev/v2" + cli "go.loglayer.dev/transports/cli/v2" + "go.loglayer.dev/transports/structured/v2" ) var t loglayer.Transport diff --git a/docs/src/transports/console.md b/docs/src/transports/console.md index 47e4021..3f8bbe2 100644 --- a/docs/src/transports/console.md +++ b/docs/src/transports/console.md @@ -16,15 +16,15 @@ The console transport is intentionally minimal. For day-to-day local development For production logging, use the [structured](/transports/structured) transport or one of the [logger wrappers](/transports/zerolog). ```sh -go get go.loglayer.dev/transports/console +go get go.loglayer.dev/transports/console/v2 ``` ## Basic Usage ```go import ( - "go.loglayer.dev" - "go.loglayer.dev/transports/console" + "go.loglayer.dev/v2" + "go.loglayer.dev/transports/console/v2" ) log := loglayer.New(loglayer.Config{ diff --git a/docs/src/transports/creating-transports.md b/docs/src/transports/creating-transports.md index 5528ef1..52a00f2 100644 --- a/docs/src/transports/creating-transports.md +++ b/docs/src/transports/creating-transports.md @@ -27,8 +27,8 @@ import ( "fmt" "io" - "go.loglayer.dev" - "go.loglayer.dev/transport" + "go.loglayer.dev/v2" + "go.loglayer.dev/v2/transport" ) type Config struct { @@ -270,8 +270,8 @@ If `New` can fail with a runtime-loaded value (URL from env, API key from secret package yourpkg import ( - "go.loglayer.dev" - "go.loglayer.dev/transport" + "go.loglayer.dev/v2" + "go.loglayer.dev/v2/transport" ) type Config struct { diff --git a/docs/src/transports/datadog.md b/docs/src/transports/datadog.md index f58bf4a..736a65f 100644 --- a/docs/src/transports/datadog.md +++ b/docs/src/transports/datadog.md @@ -10,7 +10,7 @@ description: Ship logs to the Datadog Logs HTTP intake API. Sends log entries to Datadog's [Logs HTTP intake API](https://docs.datadoghq.com/api/latest/logs/#send-logs). Built on the [HTTP transport](/transports/http) with a Datadog-specific encoder, site-aware URL, and `DD-API-KEY` header. ```sh -go get go.loglayer.dev/transports/datadog +go get go.loglayer.dev/transports/datadog/v2 ``` ## Getting an API Key and Site @@ -41,8 +41,8 @@ The API key is a secret. Treat it like a password: load it from an environment v ```go import ( - "go.loglayer.dev" - "go.loglayer.dev/transports/datadog" + "go.loglayer.dev/v2" + "go.loglayer.dev/transports/datadog/v2" ) tr := datadog.New(datadog.Config{ diff --git a/docs/src/transports/gcplogging.md b/docs/src/transports/gcplogging.md index d4d91b2..eab1f55 100644 --- a/docs/src/transports/gcplogging.md +++ b/docs/src/transports/gcplogging.md @@ -9,10 +9,10 @@ description: "Forward LogLayer entries to Google Cloud Logging via cloud.google. Forwards each entry to a caller-supplied [`*logging.Logger`](https://pkg.go.dev/cloud.google.com/go/logging#Logger) from the official Google Cloud client library. Use this on Google Cloud Run, GKE, App Engine, Cloud Functions, or any environment where you want logs to land in Google Cloud Logging (formerly Stackdriver). -Import path: `go.loglayer.dev/transports/gcplogging`. Package name: `gcplogging` (no collision with the SDK's `logging` package). +Import path: `go.loglayer.dev/transports/gcplogging/v2`. Package name: `gcplogging` (no collision with the SDK's `logging` package). ```sh -go get go.loglayer.dev/transports/gcplogging +go get go.loglayer.dev/transports/gcplogging/v2 go get cloud.google.com/go/logging ``` @@ -66,8 +66,8 @@ import ( "cloud.google.com/go/logging" - "go.loglayer.dev" - "go.loglayer.dev/transports/gcplogging" + "go.loglayer.dev/v2" + "go.loglayer.dev/transports/gcplogging/v2" ) ctx := context.Background() diff --git a/docs/src/transports/http.md b/docs/src/transports/http.md index 58b2421..8184f96 100644 --- a/docs/src/transports/http.md +++ b/docs/src/transports/http.md @@ -10,7 +10,7 @@ description: Generic batched HTTP POST transport with a pluggable encoder. The `http` transport ships log entries to an HTTP endpoint as JSON in async batches. Use it directly to talk to any log-ingestion API, or as the foundation for a service-specific wrapper (the [Datadog transport](/transports/datadog) is built on it). ```sh -go get go.loglayer.dev/transports/http +go get go.loglayer.dev/transports/http/v2 ``` The directory is `transports/http`; the package name is `httptransport` to avoid colliding with `net/http`. @@ -19,8 +19,8 @@ The directory is `transports/http`; the package name is `httptransport` to avoid ```go import ( - "go.loglayer.dev" - httptr "go.loglayer.dev/transports/http" + "go.loglayer.dev/v2" + httptr "go.loglayer.dev/transports/http/v2" ) tr := httptr.New(httptr.Config{ diff --git a/docs/src/transports/logrus.md b/docs/src/transports/logrus.md index 33534bd..453a1d0 100644 --- a/docs/src/transports/logrus.md +++ b/docs/src/transports/logrus.md @@ -10,7 +10,7 @@ description: Wrap a github.com/sirupsen/logrus logger with LogLayer. Wraps an existing `*logrus.Logger`. Map metadata flattens via `Entry.WithFields`; struct metadata lands under a configurable key. ```sh -go get go.loglayer.dev/transports/logrus +go get go.loglayer.dev/transports/logrus/v2 go get github.com/sirupsen/logrus ``` @@ -22,8 +22,8 @@ import ( "github.com/sirupsen/logrus" - "go.loglayer.dev" - lllogrus "go.loglayer.dev/transports/logrus" + "go.loglayer.dev/v2" + lllogrus "go.loglayer.dev/transports/logrus/v2" ) l := logrus.New() diff --git a/docs/src/transports/lumberjack.md b/docs/src/transports/lumberjack.md index 0167bed..d37c882 100644 --- a/docs/src/transports/lumberjack.md +++ b/docs/src/transports/lumberjack.md @@ -10,15 +10,15 @@ description: "One JSON object per log entry written to a rotating file. Backed b The `lumberjack` transport writes one JSON object per log entry to a rotating file on disk. Rotation is handled by [lumberjack.v2](https://github.com/natefinch/lumberjack): size-triggered rollover, configurable backup retention, age-based cleanup, and optional gzip compression. The on-disk format matches [`transports/structured`](/transports/structured) exactly. ```sh -go get go.loglayer.dev/transports/lumberjack +go get go.loglayer.dev/transports/lumberjack/v2 ``` ## Basic Usage ```go import ( - "go.loglayer.dev" - "go.loglayer.dev/transports/lumberjack" + "go.loglayer.dev/v2" + "go.loglayer.dev/transports/lumberjack/v2" ) log := loglayer.New(loglayer.Config{ @@ -162,8 +162,8 @@ If you keep a reference to the transport, get it directly. The upstream library import ( lj "gopkg.in/natefinch/lumberjack.v2" - "go.loglayer.dev" - "go.loglayer.dev/transports/lumberjack" + "go.loglayer.dev/v2" + "go.loglayer.dev/transports/lumberjack/v2" ) tr := lumberjack.New(lumberjack.Config{ @@ -180,9 +180,9 @@ If you only have the `*loglayer.LogLayer` (e.g. inside a handler that received t import ( lj "gopkg.in/natefinch/lumberjack.v2" - "go.loglayer.dev" - "go.loglayer.dev/transport" - "go.loglayer.dev/transports/lumberjack" + "go.loglayer.dev/v2" + "go.loglayer.dev/v2/transport" + "go.loglayer.dev/transports/lumberjack/v2" ) log := loglayer.New(loglayer.Config{ @@ -207,9 +207,9 @@ Render colorized output to the terminal during interactive runs (via the [Pretty ```go import ( - "go.loglayer.dev" - "go.loglayer.dev/transports/lumberjack" - "go.loglayer.dev/transports/pretty" + "go.loglayer.dev/v2" + "go.loglayer.dev/transports/lumberjack/v2" + "go.loglayer.dev/transports/pretty/v2" ) log := loglayer.New(loglayer.Config{ @@ -235,9 +235,9 @@ A common ops pattern: ship everything to `info.log` and ship errors-only to a sm ```go import ( - "go.loglayer.dev" - "go.loglayer.dev/transport" - "go.loglayer.dev/transports/lumberjack" + "go.loglayer.dev/v2" + "go.loglayer.dev/v2/transport" + "go.loglayer.dev/transports/lumberjack/v2" ) infoLog := lumberjack.New(lumberjack.Config{ @@ -268,7 +268,7 @@ lumberjack rotates on size, not on the clock. For a calendar-aligned roll-over ( ```go import ( "time" - "go.loglayer.dev/transports/lumberjack" + "go.loglayer.dev/transports/lumberjack/v2" ) tr := lumberjack.New(lumberjack.Config{ diff --git a/docs/src/transports/multiple-transports.md b/docs/src/transports/multiple-transports.md index fb7c90f..ba0b29c 100644 --- a/docs/src/transports/multiple-transports.md +++ b/docs/src/transports/multiple-transports.md @@ -87,11 +87,11 @@ A realistic production setup. Pretty is colorized terminal output for the develo import ( "os" - "go.loglayer.dev" - "go.loglayer.dev/transport" - "go.loglayer.dev/transports/datadog" - "go.loglayer.dev/transports/pretty" - "go.loglayer.dev/transports/structured" + "go.loglayer.dev/v2" + "go.loglayer.dev/v2/transport" + "go.loglayer.dev/transports/datadog/v2" + "go.loglayer.dev/transports/pretty/v2" + "go.loglayer.dev/transports/structured/v2" ) logFile, err := os.OpenFile("app.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0o644) diff --git a/docs/src/transports/otellog.md b/docs/src/transports/otellog.md index 0ca8c61..e5e9f4f 100644 --- a/docs/src/transports/otellog.md +++ b/docs/src/transports/otellog.md @@ -9,14 +9,14 @@ description: Emit LogLayer entries to an OpenTelemetry log.Logger. Emits each entry as an OpenTelemetry [`log.Record`](https://pkg.go.dev/go.opentelemetry.io/otel/log#Record) on a `log.Logger`. Use this when your service is wired against the OpenTelemetry SDK and you want LogLayer entries to flow through the same pipeline (OTLP exporter, Collector, observability backend) as your traces and metrics. -The package name is `otellog` to avoid colliding with `go.opentelemetry.io/otel`. Import path: `go.loglayer.dev/transports/otellog`. +The package name is `otellog` to avoid colliding with `go.opentelemetry.io/otel`. Import path: `go.loglayer.dev/transports/otellog/v2`. ```sh -go get go.loglayer.dev/transports/otellog +go get go.loglayer.dev/transports/otellog/v2 ``` ::: info Separate module -`transports/otellog` ships as its own Go module (`go.loglayer.dev/transports/otellog`) so the OpenTelemetry SDK's transitive Go-version requirement doesn't bind the main `go.loglayer.dev` module. Users who don't import the OTel transport never see its dependency graph. +`transports/otellog` ships as its own Go module (`go.loglayer.dev/transports/otellog/v2`) so the OpenTelemetry SDK's transitive Go-version requirement doesn't bind the main `go.loglayer.dev/v2` module. Users who don't import the OTel transport never see its dependency graph. Requires **Go 1.25+** because that's the floor of the upstream `go.opentelemetry.io/otel/sdk/log` packages this transport binds against. ::: @@ -27,8 +27,8 @@ If your app has already registered an OTel `LoggerProvider` globally (the common ```go import ( - "go.loglayer.dev" - "go.loglayer.dev/transports/otellog" + "go.loglayer.dev/v2" + "go.loglayer.dev/transports/otellog/v2" ) tr := otellog.New(otellog.Config{Name: "checkout-api"}) diff --git a/docs/src/transports/phuslu.md b/docs/src/transports/phuslu.md index 6104b97..1c60e3e 100644 --- a/docs/src/transports/phuslu.md +++ b/docs/src/transports/phuslu.md @@ -10,7 +10,7 @@ description: Wrap a github.com/phuslu/log logger with LogLayer. Wraps an existing `*phuslu/log.Logger`. Map metadata flattens to fields via `Entry.Any(k, v)`; struct metadata lands under a configurable key. ```sh -go get go.loglayer.dev/transports/phuslu +go get go.loglayer.dev/transports/phuslu/v2 go get github.com/phuslu/log ``` @@ -22,8 +22,8 @@ import ( plog "github.com/phuslu/log" - "go.loglayer.dev" - llphuslu "go.loglayer.dev/transports/phuslu" + "go.loglayer.dev/v2" + llphuslu "go.loglayer.dev/transports/phuslu/v2" ) p := &plog.Logger{ diff --git a/docs/src/transports/pretty.md b/docs/src/transports/pretty.md index 021103d..51cf041 100644 --- a/docs/src/transports/pretty.md +++ b/docs/src/transports/pretty.md @@ -12,7 +12,7 @@ The `pretty` transport renders log entries with ANSI color, theme support, and t **This is the recommended transport for local development and any human-readable terminal output.** For production logging, switch to [structured](/transports/structured), [zerolog](/transports/zerolog), or [zap](/transports/zap). ```sh -go get go.loglayer.dev/transports/pretty +go get go.loglayer.dev/transports/pretty/v2 ``` This transport pulls in `github.com/fatih/color` for ANSI handling. @@ -21,8 +21,8 @@ This transport pulls in `github.com/fatih/color` for ANSI handling. ```go import ( - "go.loglayer.dev" - "go.loglayer.dev/transports/pretty" + "go.loglayer.dev/v2" + "go.loglayer.dev/transports/pretty/v2" ) log := loglayer.New(loglayer.Config{ diff --git a/docs/src/transports/sentry.md b/docs/src/transports/sentry.md index 4e4dc4e..0e5ccca 100644 --- a/docs/src/transports/sentry.md +++ b/docs/src/transports/sentry.md @@ -9,10 +9,10 @@ description: Forward LogLayer entries to a sentry.Logger. Forwards each entry to a caller-supplied [`sentry.Logger`](https://pkg.go.dev/github.com/getsentry/sentry-go#Logger), Sentry's structured-logs API. Use this when you've already wired Sentry into your service for error reporting and want LogLayer entries to flow through the same pipeline. -The package directory is `transports/sentry`; the package name is `sentrytransport` to avoid colliding with the imported `sentry` identifier. Import path: `go.loglayer.dev/transports/sentry`. +The package directory is `transports/sentry`; the package name is `sentrytransport` to avoid colliding with the imported `sentry` identifier. Import path: `go.loglayer.dev/transports/sentry/v2`. ```sh -go get go.loglayer.dev/transports/sentry +go get go.loglayer.dev/transports/sentry/v2 go get github.com/getsentry/sentry-go ``` @@ -38,8 +38,8 @@ import ( "github.com/getsentry/sentry-go" - "go.loglayer.dev" - sentrytransport "go.loglayer.dev/transports/sentry" + "go.loglayer.dev/v2" + sentrytransport "go.loglayer.dev/transports/sentry/v2" ) // Initialize Sentry as you normally would. @@ -94,7 +94,7 @@ Each map entry becomes a typed Sentry attribute via the matching `LogEntry` sett Non-map metadata (structs, scalars, slices) is JSON-encoded and stored under a single configurable attribute key. The default key is `"metadata"`: ```go -import sentrytransport "go.loglayer.dev/transports/sentry" +import sentrytransport "go.loglayer.dev/transports/sentry/v2" tr := sentrytransport.New(sentrytransport.Config{ Logger: sentry.NewLogger(ctx), diff --git a/docs/src/transports/slog.md b/docs/src/transports/slog.md index bb2488e..35bf027 100644 --- a/docs/src/transports/slog.md +++ b/docs/src/transports/slog.md @@ -10,7 +10,7 @@ description: Wrap a *slog.Logger with LogLayer. Wraps a stdlib `*log/slog.Logger`. Map metadata flattens to `slog.Attr`s; struct metadata lands under a configurable key. Per-call `context.Context` attached via `WithContext` is passed through to `slog.Logger.LogAttrs` so handlers downstream (OpenTelemetry, structured shippers) can extract trace context. ```sh -go get go.loglayer.dev/transports/slog +go get go.loglayer.dev/transports/slog/v2 ``` ## Basic Usage @@ -20,8 +20,8 @@ import ( "log/slog" "os" - "go.loglayer.dev" - llslog "go.loglayer.dev/transports/slog" + "go.loglayer.dev/v2" + llslog "go.loglayer.dev/transports/slog/v2" ) handler := slog.NewJSONHandler(os.Stderr, nil) diff --git a/docs/src/transports/structured.md b/docs/src/transports/structured.md index c2ffc21..0baba01 100644 --- a/docs/src/transports/structured.md +++ b/docs/src/transports/structured.md @@ -10,15 +10,15 @@ description: One JSON object per log entry. The default for production logging. The `structured` transport always writes one JSON object per log entry. By default each entry has `level`, `time`, and `msg` fields, with fields and metadata merged at the root. ```sh -go get go.loglayer.dev/transports/structured +go get go.loglayer.dev/transports/structured/v2 ``` ## Basic Usage ```go import ( - "go.loglayer.dev" - "go.loglayer.dev/transports/structured" + "go.loglayer.dev/v2" + "go.loglayer.dev/transports/structured/v2" ) log := loglayer.New(loglayer.Config{ diff --git a/docs/src/transports/testing-transports.md b/docs/src/transports/testing-transports.md index 4549f29..4df8c5e 100644 --- a/docs/src/transports/testing-transports.md +++ b/docs/src/transports/testing-transports.md @@ -16,9 +16,9 @@ import ( "bytes" "testing" - "go.loglayer.dev" - "go.loglayer.dev/transport" - "go.loglayer.dev/transport/transporttest" + "go.loglayer.dev/v2" + "go.loglayer.dev/v2/transport" + "go.loglayer.dev/v2/transport/transporttest" ) func TestMyTransport_Basic(t *testing.T) { @@ -45,7 +45,7 @@ For wrapper transports (those that hand entries off to a third-party logger), as ## The wrapper contract suite -`transport/transporttest` ships a [`RunContract`](https://pkg.go.dev/go.loglayer.dev/transport/transporttest#RunContract) helper that drives 14 sub-tests against any wrapper-shaped transport (renders to a buffer in JSON-per-line). The same suite verifies every built-in wrapper. Wire it in with a `Factory` closure that builds a fresh `(*loglayer.LogLayer, *bytes.Buffer)` honoring per-test config overrides, plus an `Expectations` struct describing your wrapper's rendering quirks (message key, level rendering, fatal handling): +`transport/transporttest` ships a [`RunContract`](https://pkg.go.dev/go.loglayer.dev/v2/transport/transporttest#RunContract) helper that drives 14 sub-tests against any wrapper-shaped transport (renders to a buffer in JSON-per-line). The same suite verifies every built-in wrapper. Wire it in with a `Factory` closure that builds a fresh `(*loglayer.LogLayer, *bytes.Buffer)` honoring per-test config overrides, plus an `Expectations` struct describing your wrapper's rendering quirks (message key, level rendering, fatal handling): ```go func factory(opts transporttest.FactoryOpts) (*loglayer.LogLayer, *bytes.Buffer) { diff --git a/docs/src/transports/testing.md b/docs/src/transports/testing.md index a8ea5d5..fb7b921 100644 --- a/docs/src/transports/testing.md +++ b/docs/src/transports/testing.md @@ -12,11 +12,11 @@ The `transports/testing` package is the transport you want in test code: it capt For a usage walkthrough see the [Mocking](/logging-api/mocking) page in the logging API section. This page covers the package surface. ```sh -go get go.loglayer.dev/transports/testing +go get go.loglayer.dev/transports/testing/v2 ``` ```go -import lltest "go.loglayer.dev/transports/testing" +import lltest "go.loglayer.dev/transports/testing/v2" ``` (The package name is `testing`, which collides with the standard `testing` package, most users alias the import as `lltest`.) diff --git a/docs/src/transports/writers.md b/docs/src/transports/writers.md index d35659f..d36a5bc 100644 --- a/docs/src/transports/writers.md +++ b/docs/src/transports/writers.md @@ -31,8 +31,8 @@ log := loglayer.New(loglayer.Config{ ```go import ( "os" - "go.loglayer.dev" - "go.loglayer.dev/transports/structured" + "go.loglayer.dev/v2" + "go.loglayer.dev/transports/structured/v2" ) f, err := os.OpenFile("/var/log/app.log", @@ -56,8 +56,8 @@ The dedicated [lumberjack](/transports/lumberjack) transport already does this f ```go import ( "gopkg.in/natefinch/lumberjack.v2" - "go.loglayer.dev" - "go.loglayer.dev/transports/pretty" + "go.loglayer.dev/v2" + "go.loglayer.dev/transports/pretty/v2" ) rotator := &lumberjack.Logger{ @@ -103,8 +103,8 @@ A `*bytes.Buffer` works but isn't safe for concurrent writes. For real test asse ```go import ( "bytes" - "go.loglayer.dev" - "go.loglayer.dev/transports/structured" + "go.loglayer.dev/v2" + "go.loglayer.dev/transports/structured/v2" ) var buf bytes.Buffer @@ -124,8 +124,8 @@ Anything that satisfies `io.Writer` works, including `net.Conn`. The example bel ```go import ( "net" - "go.loglayer.dev" - "go.loglayer.dev/transports/structured" + "go.loglayer.dev/v2" + "go.loglayer.dev/transports/structured/v2" ) conn, err := net.Dial("tcp", "logsink.local:514") @@ -201,8 +201,8 @@ Wrapper transports ([Zerolog](/transports/zerolog), [Zap](/transports/zap), [log ```go import ( "github.com/rs/zerolog" - "go.loglayer.dev" - llzero "go.loglayer.dev/transports/zerolog" + "go.loglayer.dev/v2" + llzero "go.loglayer.dev/transports/zerolog/v2" ) // zerolog: configure on the *zerolog.Logger you build diff --git a/docs/src/transports/zap.md b/docs/src/transports/zap.md index 3374bea..f5fd55c 100644 --- a/docs/src/transports/zap.md +++ b/docs/src/transports/zap.md @@ -10,7 +10,7 @@ description: Wrap a go.uber.org/zap logger with LogLayer. Wraps a `*zap.Logger`. Map metadata becomes individual zap fields; struct metadata lands under a configurable key. Fatal-level entries are written via a custom `CheckWriteHook` so the process is **not** terminated, regardless of zap's defaults. ```sh -go get go.loglayer.dev/transports/zap +go get go.loglayer.dev/transports/zap/v2 go get go.uber.org/zap ``` @@ -20,8 +20,8 @@ go get go.uber.org/zap import ( "go.uber.org/zap" - "go.loglayer.dev" - llzap "go.loglayer.dev/transports/zap" + "go.loglayer.dev/v2" + llzap "go.loglayer.dev/transports/zap/v2" ) z, _ := zap.NewProduction() diff --git a/docs/src/transports/zerolog.md b/docs/src/transports/zerolog.md index dbc309f..dfddff4 100644 --- a/docs/src/transports/zerolog.md +++ b/docs/src/transports/zerolog.md @@ -10,7 +10,7 @@ description: Wrap a github.com/rs/zerolog logger with LogLayer. Wraps an existing `*zerolog.Logger`. Map metadata merges as fields; struct metadata lands under a configurable key. Fatal-level entries are written via `WithLevel` so the process is **not** terminated, regardless of zerolog's defaults. ```sh -go get go.loglayer.dev/transports/zerolog +go get go.loglayer.dev/transports/zerolog/v2 go get github.com/rs/zerolog ``` @@ -21,8 +21,8 @@ import ( zlog "github.com/rs/zerolog" "os" - "go.loglayer.dev" - llzero "go.loglayer.dev/transports/zerolog" + "go.loglayer.dev/v2" + llzero "go.loglayer.dev/transports/zerolog/v2" ) z := zlog.New(os.Stderr).With().Timestamp().Logger()