logie

package module
v1.0.3 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Feb 6, 2025 License: MIT Imports: 6 Imported by: 0

README

Logie

A flexible structured logging package built on top of zerolog with module-level log control.

Installation

go get github.com/Michi01/logie

Features

  • Module-based logging with independent log levels
  • Global and per-module log level control
  • Structured logging with fields
  • Console output formatting
  • Built-in support for common fields (hostname, PID, Go version)
  • Trace-level logging support

Quick Start

package main

import "github.com/Michi01/logie"

func main() {
    // Get default logger with console output
    logger := logie.DefaultLogger()
    
    // Basic logging
    logger.Info("Hello, World!")
    
    // Logging with fields
    logger.WithField("user", "john").Info("User logged in")
}

Creating Loggers

Default Logger
logger := logie.DefaultLogger()

The default logger includes:

  • Console output with timestamps
  • Hostname
  • Process ID
  • Go version
  • Application version (if BuildVersion is set)
Custom Logger
output := zerolog.ConsoleWriter{
    Out:        os.Stdout,
    TimeFormat: time.RFC3339,
}

logger := logie.New(output)
Module-Based Logging

You can create a module logger either from the package level or from an existing logger:

// Package-level creation
logger := logie.WithModule("auth")

// Or from existing logger
authLogger := existingLogger.WithModule("auth")
Custom Formatters
// Package-level creation
logger := logie.WithFormatter(myFormatter)

// Or from existing logger
formattedLogger := existingLogger.WithFormatter(myFormatter)

Log Levels

Available levels: Trace, Debug, Info, Warn, Error, Fatal, Panic

Environment Configuration
package main

import (
    "os"
    "strings"
    
    "github.com/rs/zerolog"
    "github.com/Michi01/logie"
)

func init() {
    // Set global log level from environment
    if levelStr := os.Getenv("LOG_LEVEL"); levelStr != "" {
        level := parseLogLevel(levelStr, zerolog.InfoLevel)
        logie.SetGlobalLevel(level)
    }
    
    // Configure module levels from environment
    // Format: MODULE_LOG_LEVEL_<MODULE>=<LEVEL>
    // Example: MODULE_LOG_LEVEL_AUTH=debug
    for _, env := range os.Environ() {
        if !strings.HasPrefix(env, "MODULE_LOG_LEVEL_") {
            continue
        }
        
        parts := strings.SplitN(env, "=", 2)
        if len(parts) != 2 {
            continue
        }
        
        module := strings.TrimPrefix(parts[0], "MODULE_LOG_LEVEL_")
        module = strings.ToLower(module)
        level := parseLogLevel(parts[1], zerolog.InfoLevel)
        
        logie.SetModuleLevel(module, level)
    }
}

// parseLogLevel converts a string level to zerolog.Level with a default fallback
func parseLogLevel(level string, defaultLevel zerolog.Level) zerolog.Level {
    switch strings.ToLower(level) {
    case "trace":
        return zerolog.TraceLevel
    case "debug":
        return zerolog.DebugLevel
    case "info":
        return zerolog.InfoLevel
    case "warn":
        return zerolog.WarnLevel
    case "error":
        return zerolog.ErrorLevel
    case "fatal":
        return zerolog.FatalLevel
    case "panic":
        return zerolog.PanicLevel
    default:
        return defaultLevel
    }
}
Environment Variables
  • LOG_LEVEL: Sets the global logging level (default: "info")
  • MODULE_LOG_LEVEL_<MODULE>: Sets the log level for a specific module
    • Example: MODULE_LOG_LEVEL_AUTH=debug
    • Example: MODULE_LOG_LEVEL_DATABASE=error

Usage Patterns

Global Logger
package main

import "github.com/Michi01/logie"

var log *logie.Logger

func init() {
    log = logie.DefaultLogger()
}

func main() {
    log.Info("Application started")
}
Dependency Injection Pattern
// auth/auth.go
package auth

type Service struct {
    log *logie.Logger
}

func NewService(logger *logie.Logger) *Service {
    return &Service{
        log: logger.WithModule("auth"),
    }
}

func (s *Service) Login(username string) {
    s.log.WithField("user", username).Info("Login attempt")
}

// database/db.go
package database

type Repository struct {
    log *logie.Logger
}

func NewRepository(logger *logie.Logger) *Repository {
    return &Repository{
        log: logger.WithModule("database"),
    }
}

// main.go
package main

func main() {
    logger := logie.DefaultLogger()
    
    authService := auth.NewService(logger)
    dbRepo := database.NewRepository(logger)
    
    // Both services now have their own logger instance with module context
}
Package-Level Logger
// payments/logger.go
package payments

import "github.com/Michi01/logie"

var log *logie.Logger

func init() {
    log = logie.DefaultLogger().WithModule("payments")
}

// payments/service.go
package payments

func ProcessPayment(amount float64) {
    log.WithField("amount", amount).Info("Processing payment")
}

Thread Safety

All operations in Logie are thread-safe and can be used concurrently.

Documentation

Overview

Package logie provides a flexible structured logging package built on top of zerolog with module-level log control.

Basic usage:

logger := logie.DefaultLogger()
logger.Info("Hello, World!")

With fields:

logger.WithField("user", "john").Info("User logged in")

Module-based logging:

logger := logie.New(output, logie.WithModule("auth"))

Index

Constants

This section is empty.

Variables

View Source
var BuildVersion string

Functions

func SetGlobalLevel

func SetGlobalLevel(level zerolog.Level)

func SetModuleLevel

func SetModuleLevel(module string, level zerolog.Level)

Types

type Config

type Config struct {
	GlobalLevel  zerolog.Level
	ModuleLevels map[string]zerolog.Level
}

type Formatter

type Formatter interface {
	Format([]byte) ([]byte, error)
}

type Logger

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

func DefaultLogger added in v1.0.2

func DefaultLogger() *Logger

func New

func New(out io.Writer, opts ...Option) *Logger

func WithFormatter

func WithFormatter(formatter Formatter) *Logger

func WithModule

func WithModule(module string) *Logger

func (*Logger) Debug

func (l *Logger) Debug(msg string)

func (*Logger) Debugf

func (l *Logger) Debugf(format string, args ...interface{})

func (*Logger) Error

func (l *Logger) Error(msg string)

func (*Logger) Errorf

func (l *Logger) Errorf(format string, args ...interface{})

func (*Logger) Fatal

func (l *Logger) Fatal(msg string)

func (*Logger) Fatalf

func (l *Logger) Fatalf(format string, args ...interface{})

func (*Logger) Info

func (l *Logger) Info(msg string)

func (*Logger) Infof

func (l *Logger) Infof(format string, args ...interface{})

func (*Logger) Panic

func (l *Logger) Panic(msg string)

func (*Logger) Panicf

func (l *Logger) Panicf(format string, args ...interface{})

func (*Logger) Trace

func (l *Logger) Trace(msg string)

func (*Logger) Tracef

func (l *Logger) Tracef(format string, args ...interface{})

func (*Logger) Warn

func (l *Logger) Warn(msg string)

func (*Logger) Warnf

func (l *Logger) Warnf(format string, args ...interface{})

func (*Logger) WithField

func (l *Logger) WithField(key string, value interface{}) *Logger

WithField returns a new Logger with an added field.

func (*Logger) WithFields

func (l *Logger) WithFields(fields map[string]interface{}) *Logger

func (*Logger) WithFormatter added in v1.0.3

func (l *Logger) WithFormatter(formatter Formatter) *Logger

func (*Logger) WithModule added in v1.0.3

func (l *Logger) WithModule(module string) *Logger

type Option

type Option func(*Logger)

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL