Documentation
¶
Overview ¶
Package logger provides JSON structured logging using zerolog
Package logger is a generated GoMock package.
Example (OtelConfiguration) ¶
package main
import (
"time"
"github.com/carverauto/serviceradar/pkg/logger"
)
func main() {
config := &logger.Config{
Level: "debug",
Debug: true,
Output: "stdout",
TimeFormat: "",
OTel: logger.OTelConfig{
Enabled: true,
Endpoint: "localhost:4317",
ServiceName: "my-service",
BatchTimeout: logger.Duration(5 * time.Second),
Insecure: true,
Headers: map[string]string{
"Authorization": "Bearer token123",
},
},
}
if config.OTel.Enabled {
logger.Info().Msg("OTel logging is enabled")
}
}
Example (OtelEnvironmentVariables) ¶
package main
import (
"context"
"os"
"github.com/carverauto/serviceradar/pkg/logger"
)
func main() {
_ = os.Setenv("OTEL_LOGS_ENABLED", "true")
_ = os.Setenv("OTEL_EXPORTER_OTLP_LOGS_ENDPOINT", "localhost:4317")
_ = os.Setenv("OTEL_SERVICE_NAME", "serviceradar")
_ = os.Setenv("OTEL_EXPORTER_OTLP_LOGS_HEADERS", "Authorization=Bearer token123,X-API-Key=abc123")
_ = os.Setenv("OTEL_EXPORTER_OTLP_LOGS_INSECURE", "true")
config := logger.DefaultConfig()
err := logger.Init(context.Background(), config)
if err != nil {
panic(err)
}
defer func() {
if err := logger.Shutdown(); err != nil {
panic(err)
}
}()
logger.Info().
Str("user_id", "12345").
Str("operation", "login").
Msg("User authenticated successfully")
logger.Error().
Str("error", "connection timeout").
Int("retry_count", 3).
Msg("Failed to connect to database")
}
Example (OtelGracefulShutdown) ¶
package main
import (
"context"
"github.com/carverauto/serviceradar/pkg/logger"
)
func main() {
defer func() {
if err := logger.Shutdown(); err != nil {
logger.Error().Err(err).Msg("Failed to shutdown logger")
}
}()
config := &logger.Config{
Level: "info",
Output: "stdout",
OTel: logger.OTelConfig{
Enabled: true,
Endpoint: "localhost:4317",
ServiceName: "my-service",
Insecure: true,
},
}
err := logger.Init(context.Background(), config)
if err != nil {
panic(err)
}
logger.Info().Msg("Application shutting down")
}
Example (OtelWithoutCollector) ¶
package main
import (
"context"
"github.com/carverauto/serviceradar/pkg/logger"
)
func main() {
config := &logger.Config{
Level: "info",
Output: "stdout",
OTel: logger.OTelConfig{
Enabled: false,
},
}
err := logger.Init(context.Background(), config)
if err != nil {
panic(err)
}
logger.Info().Msg("This will only go to stdout, not to OTel collector")
}
Example (UsageInService) ¶
package main
import (
"errors"
"fmt"
"github.com/carverauto/serviceradar/pkg/logger"
)
// Test errors - static errors for err113 compliance
var errInvalidUserID = errors.New("invalid user ID")
func main() {
serviceLogger := logger.WithComponent("user-service")
userID := 12345
email := "user@example.com"
serviceLogger.Info().
Int("user_id", userID).
Str("email", email).
Msg("Processing user registration")
if err := processUser(userID); err != nil {
serviceLogger.Error().
Err(err).
Int("user_id", userID).
Msg("Failed to process user")
}
serviceLogger.Info().
Int("user_id", userID).
Msg("User registration completed successfully")
}
func processUser(userID int) error {
if userID <= 0 {
return fmt.Errorf("invalid user ID: %d: %w", userID, errInvalidUserID)
}
return nil
}
Index ¶
- Variables
- func Debug() *zerolog.Event
- func Error() *zerolog.Event
- func Fatal() *zerolog.Event
- func GetLogger() zerolog.Logger
- func GetTracer(name string) otelTrace.Tracer
- func Info() *zerolog.Event
- func Init(ctx context.Context, config *Config) error
- func InitWithDefaults(ctx context.Context) error
- func InitializeMetrics(ctx context.Context, config MetricsConfig) (*sdkmetric.MeterProvider, error)
- func InitializeTracing(ctx context.Context, config TracingConfig) (*trace.TracerProvider, context.Context, otelTrace.Span, error)
- func Panic() *zerolog.Event
- func SetDebug(debug bool)
- func SetLevel(level zerolog.Level)
- func Shutdown() error
- func ShutdownOTEL() error
- func Trace() *zerolog.Event
- func Warn() *zerolog.Event
- func With() zerolog.Context
- func WithComponent(component string) zerolog.Logger
- func WithFields(fields map[string]interface{}) zerolog.Logger
- type Config
- type Duration
- type FieldLogger
- type Logger
- type LoggerInstance
- type MetricsConfig
- type MockFieldLogger
- func (m *MockFieldLogger) Debug(msg string)
- func (m *MockFieldLogger) EXPECT() *MockFieldLoggerMockRecorder
- func (m *MockFieldLogger) Error(msg string)
- func (m *MockFieldLogger) Fatal(msg string)
- func (m *MockFieldLogger) Info(msg string)
- func (m *MockFieldLogger) Panic(msg string)
- func (m *MockFieldLogger) Trace(msg string)
- func (m *MockFieldLogger) Warn(msg string)
- func (m *MockFieldLogger) WithError(err error) FieldLogger
- func (m *MockFieldLogger) WithField(key string, value any) FieldLogger
- func (m *MockFieldLogger) WithFields(fields map[string]any) FieldLogger
- type MockFieldLoggerMockRecorder
- func (mr *MockFieldLoggerMockRecorder) Debug(msg any) *gomock.Call
- func (mr *MockFieldLoggerMockRecorder) Error(msg any) *gomock.Call
- func (mr *MockFieldLoggerMockRecorder) Fatal(msg any) *gomock.Call
- func (mr *MockFieldLoggerMockRecorder) Info(msg any) *gomock.Call
- func (mr *MockFieldLoggerMockRecorder) Panic(msg any) *gomock.Call
- func (mr *MockFieldLoggerMockRecorder) Trace(msg any) *gomock.Call
- func (mr *MockFieldLoggerMockRecorder) Warn(msg any) *gomock.Call
- func (mr *MockFieldLoggerMockRecorder) WithError(err any) *gomock.Call
- func (mr *MockFieldLoggerMockRecorder) WithField(key, value any) *gomock.Call
- func (mr *MockFieldLoggerMockRecorder) WithFields(fields any) *gomock.Call
- type MockLogger
- func (m *MockLogger) Debug() *zerolog.Event
- func (m *MockLogger) EXPECT() *MockLoggerMockRecorder
- func (m *MockLogger) Error() *zerolog.Event
- func (m *MockLogger) Fatal() *zerolog.Event
- func (m *MockLogger) Info() *zerolog.Event
- func (m *MockLogger) Panic() *zerolog.Event
- func (m *MockLogger) SetDebug(debug bool)
- func (m *MockLogger) SetLevel(level zerolog.Level)
- func (m *MockLogger) Trace() *zerolog.Event
- func (m *MockLogger) Warn() *zerolog.Event
- func (m *MockLogger) With() zerolog.Context
- func (m *MockLogger) WithComponent(component string) zerolog.Logger
- func (m *MockLogger) WithFields(fields map[string]any) zerolog.Logger
- type MockLoggerMockRecorder
- func (mr *MockLoggerMockRecorder) Debug() *gomock.Call
- func (mr *MockLoggerMockRecorder) Error() *gomock.Call
- func (mr *MockLoggerMockRecorder) Fatal() *gomock.Call
- func (mr *MockLoggerMockRecorder) Info() *gomock.Call
- func (mr *MockLoggerMockRecorder) Panic() *gomock.Call
- func (mr *MockLoggerMockRecorder) SetDebug(debug any) *gomock.Call
- func (mr *MockLoggerMockRecorder) SetLevel(level any) *gomock.Call
- func (mr *MockLoggerMockRecorder) Trace() *gomock.Call
- func (mr *MockLoggerMockRecorder) Warn() *gomock.Call
- func (mr *MockLoggerMockRecorder) With() *gomock.Call
- func (mr *MockLoggerMockRecorder) WithComponent(component any) *gomock.Call
- func (mr *MockLoggerMockRecorder) WithFields(fields any) *gomock.Call
- type MultiWriter
- type OTelConfig
- type OTelWriter
- type TLSConfig
- type TracingConfig
Examples ¶
Constants ¶
This section is empty.
Variables ¶
var ( ErrOTelLoggingDisabled = errors.New("OTel logging is disabled") ErrOTelEndpointRequired = errors.New("OTel endpoint is required when enabled") )
Static errors for err113 compliance
var (
ErrInvalidDurationType = errors.New("invalid duration type")
)
Static errors for err113 compliance
var ErrOTelMetricsDisabled = errors.New("OTel metrics exporter disabled")
Static errors to match err113 guidance.
Functions ¶
func GetTracer ¶
GetTracer returns a tracer for the given name. This is a convenience function that calls otel.Tracer(). InitializeTracing must be called first to set up the global TracerProvider.
func Init ¶
Example ¶
package main
import (
"context"
"github.com/carverauto/serviceradar/pkg/logger"
)
func main() {
config := &logger.Config{
Level: "debug",
Debug: true,
Output: "stdout",
TimeFormat: "",
}
err := logger.Init(context.Background(), config)
if err != nil {
panic(err)
}
logger.Info().Str("component", "example").Msg("Logger initialized successfully")
}
func InitWithDefaults ¶
Example ¶
package main
import (
"context"
"github.com/carverauto/serviceradar/pkg/logger"
)
func main() {
err := logger.InitWithDefaults(context.Background())
if err != nil {
panic(err)
}
logger.Info().Msg("Logger initialized with defaults")
}
func InitializeMetrics ¶ added in v1.0.55
func InitializeMetrics(ctx context.Context, config MetricsConfig) (*sdkmetric.MeterProvider, error)
InitializeMetrics configures the global MeterProvider and wires an OTLP exporter so in-process instruments (identity map metrics etc.) are delivered to the collector.
It is safe to call this multiple times; subsequent calls will return the already initialised provider. If metrics exporting is disabled it returns ErrOTelMetricsDisabled.
func InitializeTracing ¶
func InitializeTracing(ctx context.Context, config TracingConfig) (*trace.TracerProvider, context.Context, otelTrace.Span, error)
InitializeTracing sets up OpenTelemetry tracing and returns a traced context with a root span. This should be called once at application startup.
Returns:
- *trace.TracerProvider: The tracer provider (caller should defer tp.Shutdown())
- context.Context: A context containing the root span
- otelTrace.Span: The root span (caller should defer span.End())
- error: Any initialization error
Example usage:
tp, ctx, rootSpan, err := logger.InitializeTracing(context.Background(), logger.TracingConfig{
ServiceName: "my-service",
ServiceVersion: "1.0.0",
Debug: true,
OTel: &config.Logging.OTel,
})
if err != nil {
return err
}
defer func() { tp.Shutdown(context.Background()) }()
defer rootSpan.End()
func SetDebug ¶
func SetDebug(debug bool)
Example ¶
package main
import (
"github.com/carverauto/serviceradar/pkg/logger"
)
func main() {
logger.SetDebug(true)
logger.Debug().Msg("This debug message will be visible")
logger.SetDebug(false)
logger.Debug().Msg("This debug message will be hidden")
logger.Info().Msg("This info message will still be visible")
}
func ShutdownOTEL ¶
func ShutdownOTEL() error
func WithComponent ¶
Example ¶
package main
import (
"github.com/carverauto/serviceradar/pkg/logger"
)
func main() {
componentLogger := logger.WithComponent("database")
componentLogger.Info().
Str("table", "users").
Int("count", 150).
Msg("Query executed successfully")
}
func WithFields ¶
Example ¶
package main
import (
"github.com/carverauto/serviceradar/pkg/logger"
)
func main() {
fields := map[string]interface{}{
"user_id": 12345,
"session_id": "abc-123-def",
"ip_address": "192.168.1.100",
}
enrichedLogger := logger.WithFields(fields)
enrichedLogger.Info().Msg("User logged in")
}
Types ¶
type Config ¶
type Config struct {
Level string `json:"level" yaml:"level"`
Debug bool `json:"debug" yaml:"debug"`
Output string `json:"output" yaml:"output"`
TimeFormat string `json:"time_format" yaml:"time_format"`
OTel OTelConfig `json:"otel" yaml:"otel"`
}
func DefaultConfig ¶
func DefaultConfig() *Config
type Duration ¶
Duration is a custom type that can unmarshal duration strings from JSON
func (*Duration) UnmarshalJSON ¶
UnmarshalJSON implements json.Unmarshaler for Duration
type FieldLogger ¶
type FieldLogger interface {
WithField(key string, value interface{}) FieldLogger
WithFields(fields map[string]interface{}) FieldLogger
WithError(err error) FieldLogger
Trace(msg string)
Debug(msg string)
Info(msg string)
Warn(msg string)
Error(msg string)
Fatal(msg string)
Panic(msg string)
}
Example ¶
package main
import (
"errors"
"github.com/carverauto/serviceradar/pkg/logger"
)
// Test errors - static errors for err113 compliance
var errDatabaseConnection = errors.New("database connection failed")
func main() {
baseLogger := logger.GetLogger()
fieldLogger := logger.NewFieldLogger(&baseLogger)
userLogger := fieldLogger.WithField("user_id", 12345)
userLogger.Info("User authenticated")
err := errDatabaseConnection
userLogger.WithError(err).Error("Failed to save user data")
}
func NewFieldLogger ¶
func NewFieldLogger(logger *zerolog.Logger) FieldLogger
type Logger ¶
type Logger interface {
Trace() *zerolog.Event
Debug() *zerolog.Event
Info() *zerolog.Event
Warn() *zerolog.Event
Error() *zerolog.Event
Fatal() *zerolog.Event
Panic() *zerolog.Event
With() zerolog.Context
WithComponent(component string) zerolog.Logger
WithFields(fields map[string]interface{}) zerolog.Logger
SetLevel(level zerolog.Level)
SetDebug(debug bool)
}
func NewTestLogger ¶
func NewTestLogger() Logger
NewTestLogger creates a no-op logger for testing that discards all output
type LoggerInstance ¶
type LoggerInstance struct {
// contains filtered or unexported fields
}
LoggerInstance holds the global logger state
type MetricsConfig ¶ added in v1.0.55
type MetricsConfig struct {
ServiceName string
ServiceVersion string
OTel *OTelConfig
// ExportInterval controls how often metric data is flushed to the OTLP collector.
// When zero, the default interval of 15 seconds is used.
ExportInterval time.Duration
}
type MockFieldLogger ¶
type MockFieldLogger struct {
// contains filtered or unexported fields
}
MockFieldLogger is a mock of FieldLogger interface.
func NewMockFieldLogger ¶
func NewMockFieldLogger(ctrl *gomock.Controller) *MockFieldLogger
NewMockFieldLogger creates a new mock instance.
func (*MockFieldLogger) Debug ¶
func (m *MockFieldLogger) Debug(msg string)
Debug mocks base method.
func (*MockFieldLogger) EXPECT ¶
func (m *MockFieldLogger) EXPECT() *MockFieldLoggerMockRecorder
EXPECT returns an object that allows the caller to indicate expected use.
func (*MockFieldLogger) Error ¶
func (m *MockFieldLogger) Error(msg string)
Error mocks base method.
func (*MockFieldLogger) Fatal ¶
func (m *MockFieldLogger) Fatal(msg string)
Fatal mocks base method.
func (*MockFieldLogger) Panic ¶
func (m *MockFieldLogger) Panic(msg string)
Panic mocks base method.
func (*MockFieldLogger) Trace ¶ added in v1.0.55
func (m *MockFieldLogger) Trace(msg string)
Trace mocks base method.
func (*MockFieldLogger) WithError ¶
func (m *MockFieldLogger) WithError(err error) FieldLogger
WithError mocks base method.
func (*MockFieldLogger) WithField ¶
func (m *MockFieldLogger) WithField(key string, value any) FieldLogger
WithField mocks base method.
func (*MockFieldLogger) WithFields ¶
func (m *MockFieldLogger) WithFields(fields map[string]any) FieldLogger
WithFields mocks base method.
type MockFieldLoggerMockRecorder ¶
type MockFieldLoggerMockRecorder struct {
// contains filtered or unexported fields
}
MockFieldLoggerMockRecorder is the mock recorder for MockFieldLogger.
func (*MockFieldLoggerMockRecorder) Debug ¶
func (mr *MockFieldLoggerMockRecorder) Debug(msg any) *gomock.Call
Debug indicates an expected call of Debug.
func (*MockFieldLoggerMockRecorder) Error ¶
func (mr *MockFieldLoggerMockRecorder) Error(msg any) *gomock.Call
Error indicates an expected call of Error.
func (*MockFieldLoggerMockRecorder) Fatal ¶
func (mr *MockFieldLoggerMockRecorder) Fatal(msg any) *gomock.Call
Fatal indicates an expected call of Fatal.
func (*MockFieldLoggerMockRecorder) Info ¶
func (mr *MockFieldLoggerMockRecorder) Info(msg any) *gomock.Call
Info indicates an expected call of Info.
func (*MockFieldLoggerMockRecorder) Panic ¶
func (mr *MockFieldLoggerMockRecorder) Panic(msg any) *gomock.Call
Panic indicates an expected call of Panic.
func (*MockFieldLoggerMockRecorder) Trace ¶ added in v1.0.55
func (mr *MockFieldLoggerMockRecorder) Trace(msg any) *gomock.Call
Trace indicates an expected call of Trace.
func (*MockFieldLoggerMockRecorder) Warn ¶
func (mr *MockFieldLoggerMockRecorder) Warn(msg any) *gomock.Call
Warn indicates an expected call of Warn.
func (*MockFieldLoggerMockRecorder) WithError ¶
func (mr *MockFieldLoggerMockRecorder) WithError(err any) *gomock.Call
WithError indicates an expected call of WithError.
func (*MockFieldLoggerMockRecorder) WithField ¶
func (mr *MockFieldLoggerMockRecorder) WithField(key, value any) *gomock.Call
WithField indicates an expected call of WithField.
func (*MockFieldLoggerMockRecorder) WithFields ¶
func (mr *MockFieldLoggerMockRecorder) WithFields(fields any) *gomock.Call
WithFields indicates an expected call of WithFields.
type MockLogger ¶
type MockLogger struct {
// contains filtered or unexported fields
}
MockLogger is a mock of Logger interface.
func NewMockLogger ¶
func NewMockLogger(ctrl *gomock.Controller) *MockLogger
NewMockLogger creates a new mock instance.
func (*MockLogger) EXPECT ¶
func (m *MockLogger) EXPECT() *MockLoggerMockRecorder
EXPECT returns an object that allows the caller to indicate expected use.
func (*MockLogger) SetLevel ¶
func (m *MockLogger) SetLevel(level zerolog.Level)
SetLevel mocks base method.
func (*MockLogger) Trace ¶ added in v1.0.55
func (m *MockLogger) Trace() *zerolog.Event
Trace mocks base method.
func (*MockLogger) WithComponent ¶
func (m *MockLogger) WithComponent(component string) zerolog.Logger
WithComponent mocks base method.
func (*MockLogger) WithFields ¶
func (m *MockLogger) WithFields(fields map[string]any) zerolog.Logger
WithFields mocks base method.
type MockLoggerMockRecorder ¶
type MockLoggerMockRecorder struct {
// contains filtered or unexported fields
}
MockLoggerMockRecorder is the mock recorder for MockLogger.
func (*MockLoggerMockRecorder) Debug ¶
func (mr *MockLoggerMockRecorder) Debug() *gomock.Call
Debug indicates an expected call of Debug.
func (*MockLoggerMockRecorder) Error ¶
func (mr *MockLoggerMockRecorder) Error() *gomock.Call
Error indicates an expected call of Error.
func (*MockLoggerMockRecorder) Fatal ¶
func (mr *MockLoggerMockRecorder) Fatal() *gomock.Call
Fatal indicates an expected call of Fatal.
func (*MockLoggerMockRecorder) Info ¶
func (mr *MockLoggerMockRecorder) Info() *gomock.Call
Info indicates an expected call of Info.
func (*MockLoggerMockRecorder) Panic ¶
func (mr *MockLoggerMockRecorder) Panic() *gomock.Call
Panic indicates an expected call of Panic.
func (*MockLoggerMockRecorder) SetDebug ¶
func (mr *MockLoggerMockRecorder) SetDebug(debug any) *gomock.Call
SetDebug indicates an expected call of SetDebug.
func (*MockLoggerMockRecorder) SetLevel ¶
func (mr *MockLoggerMockRecorder) SetLevel(level any) *gomock.Call
SetLevel indicates an expected call of SetLevel.
func (*MockLoggerMockRecorder) Trace ¶ added in v1.0.55
func (mr *MockLoggerMockRecorder) Trace() *gomock.Call
Trace indicates an expected call of Trace.
func (*MockLoggerMockRecorder) Warn ¶
func (mr *MockLoggerMockRecorder) Warn() *gomock.Call
Warn indicates an expected call of Warn.
func (*MockLoggerMockRecorder) With ¶
func (mr *MockLoggerMockRecorder) With() *gomock.Call
With indicates an expected call of With.
func (*MockLoggerMockRecorder) WithComponent ¶
func (mr *MockLoggerMockRecorder) WithComponent(component any) *gomock.Call
WithComponent indicates an expected call of WithComponent.
func (*MockLoggerMockRecorder) WithFields ¶
func (mr *MockLoggerMockRecorder) WithFields(fields any) *gomock.Call
WithFields indicates an expected call of WithFields.
type MultiWriter ¶
type MultiWriter struct {
// contains filtered or unexported fields
}
func NewMultiWriter ¶
func NewMultiWriter(writers ...io.Writer) *MultiWriter
type OTelConfig ¶
type OTelConfig struct {
Enabled bool `json:"enabled" yaml:"enabled"`
Endpoint string `json:"endpoint" yaml:"endpoint"`
Headers map[string]string `json:"headers" yaml:"headers"`
ServiceName string `json:"service_name" yaml:"service_name"`
BatchTimeout Duration `json:"batch_timeout" yaml:"batch_timeout"`
Insecure bool `json:"insecure" yaml:"insecure"`
TLS *TLSConfig `json:"tls,omitempty" yaml:"tls,omitempty"`
}
func DefaultOTelConfig ¶
func DefaultOTelConfig() OTelConfig
type OTelWriter ¶
type OTelWriter struct {
// contains filtered or unexported fields
}
func NewOTELWriter ¶
func NewOTELWriter(ctx context.Context, config OTelConfig) (*OTelWriter, error)
type TracingConfig ¶
type TracingConfig struct {
ServiceName string
ServiceVersion string
Debug bool
Logger Logger // Optional logger for debug output
OTel *OTelConfig // Optional OTel configuration for trace exporting
}
TracingConfig holds the configuration for OpenTelemetry tracing setup