Skip to main content

slogx

import "github.com/go-softwarelab/common/pkg/slogx"

Package slogx provides utility functions and helpers to complement the Go slog package. It offers convenient methods for creating and configuring loggers for both production and testing environments. Additionally, it includes tools to facilitate testing of logging output.

This package also provides a set of functions for creating slog.Args in a standardized way for some of the most popular use cases, helping ensure consistency and clarity in structured logging across your codebase.

The main goal of this package is to simplify logger setup, reduce boilerplate, and enhance the ergonomics of consistent structured logging throughout application code and tests.

Constants​

const (

// ServiceKey is a predefined constant used as a key for identifying services or components in structured logging.
ServiceKey = "service"
// ComponentKey is a predefined constant used as a key for identifying components in structured logging.
ComponentKey = "component"
// ErrorKey is a predefined constant used as a key for identifying errors in structured logging.
ErrorKey = "error"
// UserIDKey is a predefined constant used as a key for identifying user IDs in structured logging.
UserIDKey = "userId"
)

LevelNone is a special log level that disables all logging.

const LevelNone slog.Level = math.MaxInt

Child​

func Child(logger *slog.Logger, serviceName string) *slog.Logger

Child returns a new logger with the specified service name added to its attributes. If the provided logger is nil, it uses the default slog logger as the base.

ChildForComponent​

func ChildForComponent(logger *slog.Logger, componentName string) *slog.Logger

ChildForComponent returns a new logger with the specified component name added to its attributes. If the provided logger is nil, it uses the default slog logger as the base. It is strongly recommended to use slogx.Child instead of this function. However, if you need to distinguish components (such as library tools) from services, this function can be useful.

Component​

func Component(componentName string) slog.Attr

Component creates a slog.Attr with the predefined ComponentKey and the given componentName. This is a conventional attribute for marking loggers for components in an application. It is strongly recommended to use slogx.Service instead of this function. However, if you need to distinguish components (such as library tools) from services, this function can be useful.

DefaultIfNil​

func DefaultIfNil(logger *slog.Logger) *slog.Logger

DefaultIfNil returns the default slog.Logger if the given logger is nil.

Error​

func Error(err error) slog.Attr

Error returns a slog.Attr containing the provided error message under the "error" key.

Example
package main

import (
"fmt"

"github.com/go-softwarelab/common/pkg/slogx"
)

func main() {
err := fmt.Errorf("test error")
fmt.Println(slogx.Error(err))
}

Output

error=test error

IsDebug​

func IsDebug(logger *slog.Logger) bool

IsDebug checks if the provided logger has the debug level enabled.

Example
package main

import (
"fmt"

"github.com/go-softwarelab/common/pkg/slogx"
)

func main() {
debugLogger := slogx.NewBuilder().
WithLevel(slogx.LogLevelDebug).
WritingToConsole().
WithTextFormat().
Logger()

infoLogger := slogx.NewBuilder().
WithLevel(slogx.LogLevelInfo).
WritingToConsole().
WithTextFormat().
Logger()

fmt.Println(slogx.IsDebug(debugLogger))
fmt.Println(slogx.IsDebug(infoLogger))

}

Output

true
false

IsError​

func IsError(logger *slog.Logger) bool

IsError checks if the provided logger is enabled at the error logging level.

Example
package main

import (
"fmt"

"github.com/go-softwarelab/common/pkg/slogx"
)

func main() {
errorLogger := slogx.NewBuilder().
WithLevel(slogx.LogLevelError).
WritingToConsole().
WithTextFormat().
Logger()

infoLogger := slogx.NewBuilder().
WithLevel(slogx.LogLevelInfo).
WritingToConsole().
WithTextFormat().
Logger()

noneLogger := slogx.NewBuilder().
WithLevel(slogx.LogLevelNone).
WritingToConsole().
WithTextFormat().
Logger()

fmt.Println(slogx.IsError(errorLogger))
fmt.Println(slogx.IsError(infoLogger))
fmt.Println(slogx.IsError(noneLogger))

}

Output

true
true
false

IsInfo​

func IsInfo(logger *slog.Logger) bool

IsInfo checks if the provided logger has the info level enabled.

Example
package main

import (
"fmt"

"github.com/go-softwarelab/common/pkg/slogx"
)

func main() {
infoLogger := slogx.NewBuilder().
WithLevel(slogx.LogLevelInfo).
WritingToConsole().
WithTextFormat().
Logger()

warnLogger := slogx.NewBuilder().
WithLevel(slogx.LogLevelWarn).
WritingToConsole().
WithTextFormat().
Logger()

fmt.Println(slogx.IsInfo(infoLogger))
fmt.Println(slogx.IsInfo(warnLogger))

}

Output

true
false

IsWarn​

func IsWarn(logger *slog.Logger) bool

IsWarn checks if the logger is enabled for the warning level.

Example
package main

import (
"fmt"

"github.com/go-softwarelab/common/pkg/slogx"
)

func main() {
warnLogger := slogx.NewBuilder().
WithLevel(slogx.LogLevelWarn).
WritingToConsole().
WithTextFormat().
Logger()

errorLogger := slogx.NewBuilder().
WithLevel(slogx.LogLevelError).
WritingToConsole().
WithTextFormat().
Logger()

fmt.Println(slogx.IsWarn(warnLogger))
fmt.Println(slogx.IsWarn(errorLogger))

}

Output

true
false

NewLogger​

func NewLogger(opts ...func(options *NewLoggerOptions)) *slog.Logger

NewLogger creates a new slog.Logger with customizable options such as log level, writer, and format.

Example
package main

import (
"github.com/go-softwarelab/common/pkg/slogx"
)

var skipTimeInLogOutputForExamplePurposes = slogx.WithFormat(slogx.TextWithoutTimeFormat)

func main() {
logger := slogx.NewLogger(skipTimeInLogOutputForExamplePurposes)
logger.Info("test")

}

Output

level=INFO msg=test
Example (With Decorator And Managed Level)

Example using LogLevelManager with NewLogger and WithDecorator. The example sets a level for a pattern before logger creation, logs, then adds another pattern and logs again to show the change.

package main

import (
"log/slog"

"github.com/go-softwarelab/common/pkg/slogx"
)

var skipTimeInLogOutputForExamplePurposes = slogx.WithFormat(slogx.TextWithoutTimeFormat)

func main() {
// Prepare manager and set a pattern BEFORE creating the logger.
levelManager := slogx.NewLogLevelManager(slogx.LogLevelWarn)
_ = levelManager.SetLevelForServicePattern("OrderService", slog.LevelInfo)

// Build the logger with the manager and a stable text format (without time).
logger := slogx.NewLogger(skipTimeInLogOutputForExamplePurposes, slogx.WithDecorator(levelManager))

// First, create a child logger for the service.
orderSvc := slogx.Child(logger, "OrderService")

// At INFO level for OrderService, debug is filtered, info is printed.
orderSvc.Debug("dbg-1")
orderSvc.Info("info-1")

// Now add a more specific pattern AFTER logger creation.
_ = levelManager.SetLevelForServicePattern("OrderService.Payment", slog.LevelDebug)

// Create a more specific child to include the Payment sub-service.
paymentSvc := slogx.Child(orderSvc, "Payment")

// At DEBUG level for OrderService.Payment, both debug and info are printed.
paymentSvc.Debug("dbg-2")
paymentSvc.Info("info-2")

}

Output

level=INFO msg=info-1 service=OrderService
level=DEBUG msg=dbg-2 service=OrderService service=Payment
level=INFO msg=info-2 service=OrderService service=Payment
Example (With Level)

Example showing how to set a different log level using WithLevel.

package main

import (
"log/slog"

"github.com/go-softwarelab/common/pkg/slogx"
)

var skipTimeInLogOutputForExamplePurposes = slogx.WithFormat(slogx.TextWithoutTimeFormat)

func main() {
logger := slogx.NewLogger(skipTimeInLogOutputForExamplePurposes, slogx.WithLevel(slog.LevelWarn))

logger.Info("info") // filtered out at WARN level
logger.Warn("warn") // printed

}

Output

level=WARN msg=warn

NewTestLogger​

func NewTestLogger(t TestingTBOutput, opts ...func(options *NewLoggerOptions)) *slog.Logger

NewTestLogger creates a new logger instance configured for usage in tests. It writes log output through the provided testing.TB interface with debug level enabled.

Example
package main

import (
"github.com/go-softwarelab/common/pkg/slogx"
"github.com/go-softwarelab/common/pkg/testingx"
)

var skipTimeInLogOutputForExamplePurposes = slogx.WithFormat(slogx.TextWithoutTimeFormat)

func main() {
// We're simulating a test here in example.
t := &testingx.E{Verbose: true}

logger := slogx.NewTestLogger(t, skipTimeInLogOutputForExamplePurposes)
logger.Info("test")
logger.Debug("test logger is by default at DEBUG level")

}

Output

level=INFO msg=test

level=DEBUG msg="test logger is by default at DEBUG level"
Example (With Level)
package main

import (
"log/slog"

"github.com/go-softwarelab/common/pkg/slogx"
"github.com/go-softwarelab/common/pkg/testingx"
)

var skipTimeInLogOutputForExamplePurposes = slogx.WithFormat(slogx.TextWithoutTimeFormat)

func main() {
// We're simulating a test here in example.
t := &testingx.E{Verbose: true}

logger := slogx.NewTestLogger(t, skipTimeInLogOutputForExamplePurposes, slogx.WithLevel(slog.LevelInfo))
logger.Info("test")
// This debug message will be filtered out at INFO level.
logger.Debug("test logger is by default at DEBUG level")

}

Output

level=INFO msg=test

Number​

func Number[T types.Number](key string, value T) slog.Attr

Number makes easier creation slog.Attr based on any number (int, float, uint) or the custom type over the number type.

Example (Custom Type)
package main

import (
"fmt"

"github.com/go-softwarelab/common/pkg/slogx"
)

func main() {
type MyInt int
type MyFloat float64
type MyUint uint

fmt.Println(slogx.Number("key", MyInt(42)))
fmt.Println(slogx.Number("key", MyFloat(42.5)))
fmt.Println(slogx.Number("key", MyUint(42)))
}

Output

key=42
key=42.5
key=42
Example (Float)
package main

import (
"fmt"

"github.com/go-softwarelab/common/pkg/slogx"
)

func main() {
fmt.Println(slogx.Number("key", float32(42.5)))
fmt.Println(slogx.Number("key", float64(42.5)))
}

Output

key=42.5
key=42.5
Example (Int)
package main

import (
"fmt"

"github.com/go-softwarelab/common/pkg/slogx"
)

func main() {
fmt.Println(slogx.Number("key", 42))
fmt.Println(slogx.Number("key", int8(42)))
fmt.Println(slogx.Number("key", int16(42)))
fmt.Println(slogx.Number("key", int32(42)))
fmt.Println(slogx.Number("key", int64(42)))
}

Output

key=42
key=42
key=42
key=42
key=42
Example (Uint)
package main

import (
"fmt"

"github.com/go-softwarelab/common/pkg/slogx"
)

func main() {
fmt.Println(slogx.Number("key", uint(42)))
fmt.Println(slogx.Number("key", uint8(42)))
fmt.Println(slogx.Number("key", uint16(42)))
fmt.Println(slogx.Number("key", uint32(42)))
fmt.Println(slogx.Number("key", uint64(42)))
}

Output

key=42
key=42
key=42
key=42
key=42

OptionalNumber​

func OptionalNumber[T types.Number](key string, value *T) slog.Attr

OptionalNumber makes easier creation slog.Attr based on pointer to any number (int, float, uint) or the custom type over the number type.

Example (Custom Type)
package main

import (
"fmt"

"github.com/go-softwarelab/common/pkg/slogx"
)

func main() {
type MyInt int
n := MyInt(42)
fmt.Println(slogx.OptionalNumber("key", &n))
}

Output

key=42
Example (Float)
package main

import (
"fmt"

"github.com/go-softwarelab/common/pkg/slogx"
)

func main() {
n := 42.5
fmt.Println(slogx.OptionalNumber("key", &n))
}

Output

key=42.5
Example (Int)
package main

import (
"fmt"

"github.com/go-softwarelab/common/pkg/slogx"
)

func main() {
n := 42
fmt.Println(slogx.OptionalNumber("key", &n))
}

Output

key=42
Example (Nil)
package main

import (
"fmt"

"github.com/go-softwarelab/common/pkg/slogx"
)

func main() {
var n *int
fmt.Println(slogx.OptionalNumber("key", n))
}

Output

key=<nil>

OptionalString​

func OptionalString[S ~string](key string, value *S) slog.Attr

OptionalString returns a slog.Attr for a string pointer. If the pointer is nil, it sets the value to "<nil>".

Example (Basic)
package main

import (
"fmt"

"github.com/go-softwarelab/common/pkg/slogx"
)

func main() {
s := "value"
fmt.Println(slogx.OptionalString("key", &s))
}

Output

key=value
Example (Custom Type)
package main

import (
"fmt"

"github.com/go-softwarelab/common/pkg/slogx"
)

func main() {
type MyString string
s := MyString("custom value")
fmt.Println(slogx.OptionalString("key", &s))
}

Output

key=custom value
Example (Nil)
package main

import (
"fmt"

"github.com/go-softwarelab/common/pkg/slogx"
)

func main() {
var s *string
fmt.Println(slogx.OptionalString("key", s))
}

Output

key=<nil>

OptionalUserID​

func OptionalUserID[ID types.Number | ~string](userID *ID) slog.Attr

OptionalUserID returns a slog.Attr representing the "userId" or a default value of "<unknown>" if userID is nil.

Example (Int)
package main

import (
"fmt"

"github.com/go-softwarelab/common/pkg/slogx"
)

func main() {
id := 42
fmt.Println(slogx.OptionalUserID(&id))
}

Output

userId=42
Example (Nil)
package main

import (
"fmt"

"github.com/go-softwarelab/common/pkg/slogx"
)

func main() {
var id *string
fmt.Println(slogx.OptionalUserID(id))
}

Output

userId=<unknown>
Example (String)
package main

import (
"fmt"

"github.com/go-softwarelab/common/pkg/slogx"
)

func main() {
id := "user123"
fmt.Println(slogx.OptionalUserID(&id))
}

Output

userId=user123

Service​

func Service(serviceName string) slog.Attr

Service creates a slog.Attr with the predefined ServiceKey and the given serviceName. This is a conventional attr for marking loggers for services/components in application.

SilentLogger​

func SilentLogger() *slog.Logger

SilentLogger returns a new logger instance configured with a handler that discards all log output, effectively creating a logger that won't log any messages.

Example
package main

import (
"github.com/go-softwarelab/common/pkg/slogx"
)

func main() {
logger := slogx.SilentLogger()
logger.Info("this message will be discarded")
logger.Error("this error will also be discarded")

}

Output

String​

func String[S ~string](key string, value S) slog.Attr

String returns a slog.Attr with the provided key and string value. It's almost the same as a slog.String function, but allows for any custom type based on string to be passed as value.

Example (Basic)
package main

import (
"fmt"

"github.com/go-softwarelab/common/pkg/slogx"
)

func main() {
fmt.Println(slogx.String("key", "value"))
fmt.Println(slogx.String("empty", ""))
}

Output

key=value
empty=
Example (Custom Type)
package main

import (
"fmt"

"github.com/go-softwarelab/common/pkg/slogx"
)

func main() {
type MyString string
s := MyString("custom value")
fmt.Println(slogx.String("key", s))
}

Output

key=custom value
Example (Empty)
package main

import (
"fmt"

"github.com/go-softwarelab/common/pkg/slogx"
)

func main() {
var s string
fmt.Println(slogx.String("key", s))
}

Output

key=

UserID​

func UserID[ID types.Number | ~string](userID ID) slog.Attr

UserID creates a slog.Attr representing the "userId".

Example (Custom Type)
package main

import (
"fmt"

"github.com/go-softwarelab/common/pkg/slogx"
)

func main() {
type UserIDInt int
type UserIDString string

fmt.Println(slogx.UserID(UserIDInt(42)))
fmt.Println(slogx.UserID(UserIDString("user123")))
}

Output

userId=42
userId=user123
Example (Int)
package main

import (
"fmt"

"github.com/go-softwarelab/common/pkg/slogx"
)

func main() {
fmt.Println(slogx.UserID(42))
}

Output

userId=42
Example (String)
package main

import (
"fmt"

"github.com/go-softwarelab/common/pkg/slogx"
)

func main() {
fmt.Println(slogx.UserID("user123"))
}

Output

userId=user123

WithAdditionalDotPatternAttrKeys​

func WithAdditionalDotPatternAttrKeys(keys ...string) func(*DynamicLogLevelOptions)

WithAdditionalDotPatternAttrKeys adds additional keys to the list of keys used for dynamic log level matching. By default, the keys are "service" and "component". The keys are matched against the logger attributes keys and the values are matched against the pattern.

WithDecorator​

func WithDecorator(decorator ...HandlerDecorator) func(*NewLoggerOptions)

WithDecorator adds a handler decorator to the logger. The decorator is applied to the handler after it is created. The order of decorators applies from the first to the last.

WithFormat​

func WithFormat(format LogFormat) func(*NewLoggerOptions)

WithFormat sets the log format for the logger. To setup logger for tests (NewTestLogger) use WithTestLoggerFormat instead

WithLevel​

func WithLevel[L LogLevel | slog.Level](level L) func(*NewLoggerOptions)

WithLevel sets the logging level for the logger. To setup logger for tests (NewTestLogger) use WithTestLoggerLevel instead

WithWriter​

func WithWriter(writer io.Writer) func(*NewLoggerOptions)

WithWriter returns a functional option to set a custom io.Writer for logger to output to.

type CollectingLogsWriter​

CollectingLogsWriter is a simple io.Writer implementation that writes to a string builder. It is useful for testing purposes - to check what was written by the logger.

type CollectingLogsWriter struct {
strings.Builder
}

NewCollectingLogsWriter​

func NewCollectingLogsWriter() *CollectingLogsWriter

NewCollectingLogsWriter creates a new CollectingLogsWriter.

*CollectingLogsWriter.Clear​

func (w *CollectingLogsWriter) Clear()

Clear the stored log output.

*CollectingLogsWriter.Lines​

func (w *CollectingLogsWriter) Lines() []string

Lines returns a slice of lines from the log output.

type DecoratorOptions​

DecoratorOptions is the options for decorating a slog.Handler.

type DecoratorOptions struct {
Additional map[string]any
}

type DynamicLogLevelOptions​

type DynamicLogLevelOptions struct {
// contains filtered or unexported fields
}

type HandlerDecorator​

HandlerDecorator is an interface for decorating a slog.Handler.

type HandlerDecorator interface {
// DecorateHandler decorates the provided handler and returns the decorated handler.
DecorateHandler(handler slog.Handler, options *DecoratorOptions) slog.Handler
}

type HandlerDecoratorFunc​

HandlerDecoratorFunc is a function that implements HandlerDecorator interface.

type HandlerDecoratorFunc func(handler slog.Handler) slog.Handler

HandlerDecoratorFunc.DecorateHandler​

func (f HandlerDecoratorFunc) DecorateHandler(handler slog.Handler, _ *DecoratorOptions) slog.Handler

DecorateHandler implements HandlerDecorator interface.

type HandlerDecoratorFuncWithOptions​

HandlerDecoratorFuncWithOptions is a function that implements HandlerDecorator interface.

type HandlerDecoratorFuncWithOptions func(handler slog.Handler, options *DecoratorOptions) slog.Handler

HandlerDecoratorFuncWithOptions.DecorateHandler​

func (f HandlerDecoratorFuncWithOptions) DecorateHandler(handler slog.Handler, options *DecoratorOptions) slog.Handler

DecorateHandler implements HandlerDecorator interface.

type LogFormat​

LogFormat represents different log handler types which can be configured.

type LogFormat string

Supported handler types (based on slog).

const (
// JSONFormat is a standard slog json format.
JSONFormat LogFormat = "json"
// TextFormat is a standard slog text format.
TextFormat LogFormat = "text"
// TextWithoutTimeFormat is a text format without showing the time, it is mostly useful for testing or examples.
TextWithoutTimeFormat LogFormat = "text-no-time"
)

ParseLogFormat​

func ParseLogFormat[H ~string](handlerType H) (LogFormat, error)

ParseLogFormat parses a string into a LogFormat enum (case-insensitive).

type LogLevel​

LogLevel string representation of different log levels, which can be configured.

type LogLevel string

Supported log levels (based on slog).

const (
LogLevelDebug LogLevel = "debug"
LogLevelInfo LogLevel = "info"
LogLevelWarn LogLevel = "warn"
LogLevelError LogLevel = "error"
LogLevelNone LogLevel = "none"
)

ParseLogLevel​

func ParseLogLevel[L ~string](level L) (LogLevel, error)

ParseLogLevel parses a string into a LogLevel enum (case-insensitive).

LogLevel.GetSlogLevel​

func (l LogLevel) GetSlogLevel() (slog.Level, error)

GetSlogLevel returns the slog.Level representation of the LogLevel.

LogLevel.MustGetSlogLevel​

func (l LogLevel) MustGetSlogLevel() slog.Level

MustGetSlogLevel returns the slog.Level representation of the LogLevel. Panics if the LogLevel is invalid.

type LogLevelManager​

LogLevelManager is a logger decorator that allows to configure log levels dynamically based on logger attributes.

type LogLevelManager struct {
// contains filtered or unexported fields
}

NewLogLevelManager​

func NewLogLevelManager[L slog.Level | LogLevel](level L, opts ...func(*DynamicLogLevelOptions)) *LogLevelManager

NewLogLevelManager creates a new LogLevelManager.

NewLoggerWithManagedLevel​

func NewLoggerWithManagedLevel(level LogLevel) (*slog.Logger, *LogLevelManager)

NewLoggerWithManagedLevel creates a new slog.Logger and LogLevelManager with the specified log level. LogLevelManager is applied to the resulting logger. Use the LogLevelManager to change the log level for particular child loggers at runtime.

Example

Example using LogLevelManager obtained from NewLoggerWithManagedLevel. We rebuild a logger with the same manager to control the output format in this example.

package main

import (
"log/slog"

"github.com/go-softwarelab/common/pkg/slogx"
)

var skipTimeInLogOutputForExamplePurposes = slogx.WithFormat(slogx.TextWithoutTimeFormat)

func main() {
// Create a manager via helper and then build a logger with a stable format for the example output.
_, levelManager := slogx.NewLoggerWithManagedLevel(slogx.LogLevelWarn)
logger := slogx.NewLogger(skipTimeInLogOutputForExamplePurposes, slogx.WithDecorator(levelManager))

// Create a service-scoped child logger.
svc := slogx.Child(logger, "OrderService")

// Before adding a pattern, debug is filtered out (default WARN).
svc.Debug("debug before change")

// Enable DEBUG for the specific service using a dot pattern.
_ = levelManager.SetLevelForServicePattern("OrderService", slog.LevelDebug)

// Now DEBUG is enabled for OrderService.
svc.Debug("debug after change")

}

Output

level=DEBUG msg="debug after change" service=OrderService

*LogLevelManager.Decorate​

func (m *LogLevelManager) Decorate(handler slog.Handler) slog.Handler

Decorate decorates the given handler with the LogLevelManager.

*LogLevelManager.DecorateHandler​

func (m *LogLevelManager) DecorateHandler(handler slog.Handler, _ *DecoratorOptions) slog.Handler

DecorateHandler decorates the given handler with the LogLevelManager.

*LogLevelManager.SetLevel​

func (m *LogLevelManager) SetLevel(level slog.Level)

SetLevel sets the default logging level to the specified slog.Level.

*LogLevelManager.SetLevelForServicePattern​

func (m *LogLevelManager) SetLevelForServicePattern(pattern string, level slog.Level) error

SetLevelForServicePattern associates a logging level with a given simple dot-separated pattern for dynamic log level matching. Returns an error if the pattern cannot be parsed or the level cannot be set.

Dot-Service-Pattern is a string containing dot-separated services (or components) names, such as "Service.Component". The pattern's dot-separated parts are matched against the logger attributes values whose key is "service" (or "component"). The specified level is applied to all attributes that match the pattern. The most specific matching pattern determines the log level. If multiple patterns of equal specificity match, one is chosen arbitrarily.

For example: Given the patterns: "Service1" and "Service1.Service2", and logger attributes: service="Service1", service="Service2", user=1 the level set for the pattern "Service1.Service2" will be used.

*LogLevelManager.SetLevels​

func (m *LogLevelManager) SetLevels(patterns map[string]any) error

SetLevels updates logging levels using a map of patterns and their corresponding levels; returns an error if invalid input. Currently only a dot-service-pattern is supported, see SetLevelForServicePattern for details. Value can be:

  • string - string value parseable to slogx.LogLevel
  • int: any integer value - although it's recommended to use slog.Level values
  • slogx.LogLevel
  • slog.Level

*LogLevelManager.SetLogLevel​

func (m *LogLevelManager) SetLogLevel(level LogLevel)

SetLogLevel sets the default logging level to the specified slogx.LogLevel.

type LoggerBuilderWithHandler​

type LoggerBuilderWithHandler interface {
// WithHandlerDecorator adds a handler decorator to the logger.
// The decorator is applied to the handler after it is created.
// The order of decorators applies from the first to the last.
WithHandlerDecorator(decorators ...HandlerDecorator) LoggerBuilderWithHandler

LoggerFactory
}

type LoggerFactory​

type LoggerFactory interface {
// Logger creates and returns a configured *slog.Logger instance based on the current logger configuration.
Logger() *slog.Logger
}

type LoggerHandlerBuilder​

type LoggerHandlerBuilder interface {
// WithTextFormat configures the logger to use a text-based log format.
WithTextFormat() LoggerBuilderWithHandler

// WithJSONFormat configures the logger to use a JSON-based log format.
WithJSONFormat() LoggerBuilderWithHandler

// WithFormat sets the handler of a given type for the logger.
WithFormat(handlerType LogFormat) LoggerBuilderWithHandler
}

type LoggerLevelBuilder​

LoggerLevelBuilder is the main interface for configuring a logger.

type LoggerLevelBuilder interface {
// WithLevel sets the log level for the logger.
WithLevel(level LogLevel) LoggerOutputBuilder
// WithSlogLevel sets the log slog.Level for the logger.
WithSlogLevel(level slog.Level) LoggerOutputBuilder
// Silent sets the special logger handler to discard all logs.
Silent() LoggerFactory
}

NewBuilder​

func NewBuilder() LoggerLevelBuilder

NewBuilder creates a new Builder for configuring a logger.

type LoggerOpt​

LoggerOpt is an alias for functional option for slogx.NewLogger and slogx.NewTestLogger.

type LoggerOpt = func(*NewLoggerOptions)

type LoggerOpts​

LoggerOpts is an alias for a slice of functional options for slogx.NewLogger and slogx.NewTestLogger.

type LoggerOpts = []LoggerOpt

type LoggerOutputBuilder​

type LoggerOutputBuilder interface {
// WritingToConsole configures a logger to write logs to the stdout
WritingToConsole() LoggerHandlerBuilder

// WritingTo configures the logger to write logs to the provided io.Writer
WritingTo(writer io.Writer) LoggerHandlerBuilder

// WithCustomHandler sets a custom slog.Handler for the logger.
WithCustomHandler(handler slog.Handler) LoggerFactory
}

type NewLoggerOptions​

NewLoggerOptions is a set of options for slogx.NewLogger and slogx.NewTestLogger.

type NewLoggerOptions struct {
// contains filtered or unexported fields
}

type RestyLogger​

RestyLogger represents an interface of logger required by github.com/go-resty/resty

type RestyLogger interface {
Errorf(format string, v ...interface{})
Warnf(format string, v ...interface{})
Debugf(format string, v ...interface{})
}

RestyAdapter​

func RestyAdapter(logger *slog.Logger) RestyLogger

RestyAdapter create an adapter on slog.Logger that will allow it to be use with github.com/go-resty/resty library

type TestingTBOutput​

TestingTBOutput is an interface that represents a testing.TB instance required methods to be used by NewTestLogger and TestingTBWriter.

type TestingTBOutput interface {
Helper()
Log(args ...any)
}

type TestingTBWriter​

TestingTBWriter is a utility type that implements the io.Writer interface by writing log output to testing.TB. It is commonly used in test scenarios to redirect logs to the test's output via the provided testing.TB instance.

type TestingTBWriter struct {
// contains filtered or unexported fields
}

NewTestingTBWriter​

func NewTestingTBWriter(t TestingTBOutput) *TestingTBWriter

NewTestingTBWriter creates a new TestingTBWriter that writes output to the provided testing.TB instance.

*TestingTBWriter.Write​

func (w *TestingTBWriter) Write(p []byte) (n int, err error)

Write writes the provided byte slice to the testing.TB instance.

*TestingTBWriter.WriteString​

func (w *TestingTBWriter) WriteString(s string) (n int, err error)

WriteString writes the provided string to the testing.TB instance.