sglogger

package module
v0.1.2 Latest Latest
Warning

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

Go to latest
Published: Nov 30, 2025 License: MIT Imports: 7 Imported by: 2

README

SGLogger

Простая и гибкая система логирования для Go-приложений с поддержкой структурированного логирования и множественных провайдеров.

Особенности

  • 🎯 Множественные провайдеры - одновременная запись в разные источники (консоль, файлы, удаленные системы)
  • 📊 Структурированное логирование - поддержка дополнительных полей для удобства анализа
  • 🚀 Гибкая конфигурация - настраиваемые уровни логирования и форматы вывода
  • 🔒 Потокобезопасность - готово к использованию в concurrent-средах
  • 📝 Богатый API - различные методы для разных сценариев логирования

Установка

go get github.com/SergeiKhanlarov/seri-go-logger

Быстрый старт

Простое использование
package main

import (
    "context"
    "github.com/your-username/sglogger"
)

func main() {
    ctx := context.Background()
    
    // Создание логгера с настройками по умолчанию
    logger := sglogger.NewLoggerDefault(sglogger.ProviderConfig{
        LoggerConfig: sglogger.LoggerConfig{},
        level:       sglogger.LevelInfo,
    }, sglogger.NewFieldsHandler())
    
    // Логирование с разными уровнями
    logger.Info(ctx, "Приложение запущено")
    logger.Debug(ctx, "Отладочная информация: %s", "значение")
    logger.Warning(ctx, "Нештатная ситуация")
    logger.Error(ctx, "Произошла ошибка: %s", "описание ошибки")
}
Использование с контекстом и полями
package main

import (
    "context"
    "errors"
    "github.com/your-username/sglogger"
)

func main() {
    // Добавление trace_id в контекст
    ctx := context.WithValue(context.Background(), sglogger.TraceIDKey, "trace-123")
    
    logger := sglogger.NewLoggerDefault(sglogger.ProviderConfig{
        level: sglogger.LevelDebug,
    }, sglogger.NewFieldsHandler())
    
    // Логирование с ошибками
    err := errors.New("файл не найден")
    logger.ErrorErr(ctx, err, "Не удалось обработать запрос")
    
    // Логирование с дополнительными полями
    fields := sglogger.Fields{
        "user_id":    12345,
        "operation":  "file_upload",
        "file_size":  1024000,
    }
    logger.InfoWithFields(ctx, fields, "Файл успешно загружен")
    
    // Комбинированное использование
    logger.ErrorErrWithFields(ctx, err, fields, "Ошибка при загрузке файла")
}
Расширенное использование

Создание кастомного логгера с несколькими провайдерами

package main

import (
    "context"
    "github.com/your-username/sglogger"
)

func main() {
    ctx := context.Background()
    
    // Создание нескольких провайдеров
    consoleProvider := sglogger.NewFmtProvider(sglogger.ProviderConfig{
        level: sglogger.LevelDebug, // Все сообщения
    })
    
    fileProvider := sglogger.NewFmtProvider(sglogger.ProviderConfig{
        level: sglogger.LevelWarn, // Только предупреждения и выше
    })
    
    // Кастомный логгер с несколькими провайдерами
    logger := sglogger.NewLogger(
        sglogger.LoggerConfig{},
        sglogger.NewFieldsHandler(),
        consoleProvider,
        fileProvider,
    )
    
    logger.Info(ctx, "Это сообщение будет в консоли")
    logger.Warning(ctx, "Это сообщение будет в консоли и файле")
}

Уровни логирования

LevelDebug - Детальная отладочная информация
LevelInfo - Общая информация о работе приложения
LevelWarn - Нештатные ситуации, которые не приводят к ошибкам
LevelError - Ошибки, влияющие на работу приложения
LevelFatal - Критические ошибки, приводящие к остановке приложения
Основные методы логирования

Каждый уровень логирования поддерживает несколько вариантов методов:

// Базовое логирование
logger.Info(ctx, format, args...)

// Логирование с ошибкой
logger.ErrorErr(ctx, err, format, args...)

// Логирование с дополнительными полями
logger.InfoWithFields(ctx, fields, format, args...)

// Комбинированное использование
logger.ErrorErrWithFields(ctx, err, fields, format, args...)
Fields (Дополнительные поля)
fields := sglogger.Fields{
    "user_id":    123,
    "request_id": "abc-123",
    "duration":   150.5,
}
Создание собственных провайдеров

Для создания собственного провайдера необходимо реализовать интерфейс LoggerProvider:

type LoggerProvider interface {
    Write(ctx context.Context, level Level, message string, fields Fields) error
    ShouldLog(ctx context.Context, level Level) bool
    Close(ctx context.Context) error
}

Пример кастомного провайдера

type CustomProvider struct {
    config ProviderConfig
}

func NewCustomProvider(config ProviderConfig) LoggerProvider {
    return &CustomProvider{config: config}
}

func (p *CustomProvider) Write(ctx context.Context, level Level, message string, fields Fields) error {
    // Ваша реализация логирования
    return nil
}

func (p *CustomProvider) ShouldLog(ctx context.Context, level Level) bool {
    return level >= p.config.level
}

func (p *CustomProvider) Close(ctx context.Context) error {
    // Очистка ресурсов
    return nil
}
Конфигурация

LoggerConfig

Базовая конфигурация для всех логгеров и провайдеров.

ProviderConfig

Расширяет LoggerConfig специфичными для провайдера настройками:

config := ProviderConfig{
    LoggerConfig: LoggerConfig{},
    level:       LevelInfo,
}
Best Practices

Передавайте контекст - используйте context для сквозной идентификации запросов
Используйте структурированное логирование - поля упрощают поиск и анализ логов
Настраивайте уровни логирования - разные среды требуют разной детализации
Комбинируйте провайдеры - используйте разные провайдеры для разных целей
Обрабатывайте ошибки в провайдерах - избегайте падения приложения из-за проблем с логированием

📄 Лицензия

MIT License - смотрите файл LICENSE для деталей.

Copyright (c) 2025 Ханларов Сергей

Documentation

Index

Constants

View Source
const (
	TraceIDKey contextKey = "trace_id"
)

Variables

This section is empty.

Functions

This section is empty.

Types

type Fields

type Fields map[string]interface{}

Fields представляет дополнительные поля для структурированного логирования. Позволяет добавлять метаданные к логам для удобства поиска и анализа. Пример: Fields{"user_id": 123, "request_id": "abc-123"}

type FieldsHandler

type FieldsHandler interface {
	// ExtractFieldsFromContext извлекает поля из контекста и объединяет их с переданными полями.
	// Контекст может содержать стандартные поля (например, trace_id) для сквозной трассировки.
	ExtractFieldsFromContext(ctx context.Context, fields Fields) Fields

	// MergeFields объединяет два набора полей. При конфликте ключей
	// значения из fields2 перезаписывают значения из fields1.
	MergeFields(fields1, fields2 Fields) Fields
}

FieldsHandler определяет интерфейс для работы с дополнительными полями логов. Обеспечивает извлечение полей из контекста и объединение наборов полей.

func NewFieldsHandler

func NewFieldsHandler() FieldsHandler

NewFieldsHandler создает новый экземпляр обработчика полей логов. Возвращает интерфейс FieldsHandler для использования в системе логирования.

type Level

type Level int

Level представляет уровень логирования

const (
	LevelDebug Level = iota // Уровень отладки - детальная информация для разработчиков
	LevelInfo               // Информационный уровень - общая информация о работе приложения
	LevelWarn               // Уровень предупреждения - нештатные ситуации, которые не приводят к ошибкам
	LevelError              // Уровень ошибки - ошибки, которые влияют на работу приложения
	LevelFatal              // Критический уровень - ошибки, приводящие к остановке приложения
)

type Logger

type Logger interface {
	// Debug логирует сообщение уровня отладки
	Debug(ctx context.Context, format string, args ...interface{})

	// Info логирует информационное сообщение
	Info(ctx context.Context, format string, args ...interface{})

	// Warning логирует предупреждение
	Warning(ctx context.Context, format string, args ...interface{})

	// Error логирует сообщение об ошибке
	Error(ctx context.Context, format string, args ...interface{})

	// Fatal логирует критическую ошибку и завершает приложение
	Fatal(ctx context.Context, format string, args ...interface{})

	// DebugErr логирует сообщение уровня отладки с ошибкой
	DebugErr(ctx context.Context, err error, format string, args ...interface{})

	// InfoErr логирует информационное сообщение с ошибкой
	InfoErr(ctx context.Context, err error, format string, args ...interface{})

	// WarningErr логирует предупреждение с ошибкой
	WarningErr(ctx context.Context, err error, format string, args ...interface{})

	// ErrorErr логирует сообщение об ошибке с дополнительной ошибкой
	ErrorErr(ctx context.Context, err error, format string, args ...interface{})

	// FatalErr логирует критическую ошибку с дополнительной ошибкой и завершает приложение
	FatalErr(ctx context.Context, err error, format string, args ...interface{})

	// DebugWithFields логирует сообщение уровня отладки с дополнительными полями
	DebugWithFields(ctx context.Context, fields Fields, format string, args ...interface{})

	// InfoWithFields логирует информационное сообщение с дополнительными полями
	InfoWithFields(ctx context.Context, fields Fields, format string, args ...interface{})

	// WarningWithFields логирует предупреждение с дополнительными полями
	WarningWithFields(ctx context.Context, fields Fields, format string, args ...interface{})

	// ErrorWithFields логирует сообщение об ошибке с дополнительными полями
	ErrorWithFields(ctx context.Context, fields Fields, format string, args ...interface{})

	// FatalWithFields логирует критическую ошибку с дополнительными полями и завершает приложение
	FatalWithFields(ctx context.Context, fields Fields, format string, args ...interface{})

	// DebugErrWithFields логирует сообщение уровня отладки с ошибкой и дополнительными полями
	DebugErrWithFields(ctx context.Context, err error, fields Fields, format string, args ...interface{})

	// InfoErrWithFields логирует информационное сообщение с ошибкой и дополнительными полями
	InfoErrWithFields(ctx context.Context, err error, fields Fields, format string, args ...interface{})

	// WarningErrWithFields логирует предупреждение с ошибкой и дополнительными полями
	WarningErrWithFields(ctx context.Context, err error, fields Fields, format string, args ...interface{})

	// ErrorErrWithFields логирует сообщение об ошибке с дополнительной ошибкой и полями
	ErrorErrWithFields(ctx context.Context, err error, fields Fields, format string, args ...interface{})

	// FatalErrWithFields логирует критическую ошибку с дополнительной ошибкой, полями и завершает приложение
	FatalErrWithFields(ctx context.Context, err error, fields Fields, format string, args ...interface{})
}

Logger определяет основной интерфейс для логирования в приложении. Предоставляет методы для логирования с различными комбинациями параметров: - интерполяция строк (форматирование) - обработка ошибок - структурированные поля

func NewLogger

func NewLogger(config LoggerConfig, fieldsHandler FieldsHandler, providers ...LoggerProvider) Logger

NewLogger создает кастомный логгер с указанными провайдерами. Позволяет гибко настраивать вывод логов через multiple providers. Пример: файловый провайдер + провайдер для Sentry + stdout провайдер.

func NewLoggerDefault

func NewLoggerDefault(config ProviderConfig, fieldsHandler FieldsHandler) Logger

NewLoggerDefault создает логгер с конфигурацией по умолчанию. Использует fmtProvider как единственный провайдер вывода. Удобен для быстрого старта и разработки.

type LoggerConfig

type LoggerConfig struct {
}

LoggerConfig defines base configuration for all loggers and providers. Contains common settings that apply to all logging components.

type LoggerProvider

type LoggerProvider interface {
	// Write записывает лог-сообщение с указанным уровнем, текстом и дополнительными полями.
	// Возвращает ошибку в случае проблем при записи.
	Write(ctx context.Context, level Level, message string, fields Fields) error

	// ShouldLog проверяет, нужно ли логировать сообщение данного уровня.
	// Используется для фильтрации логов по уровню важности.
	ShouldLog(ctx context.Context, level Level) bool

	// Close освобождает ресурсы провайдера. Должен вызываться при завершении работы приложения.
	Close(ctx context.Context) error
}

LoggerProvider определяет интерфейс для провайдеров логирования. Провайдеры отвечают за запись логов в конкретные места назначения (консоль, файл, Loki и т.д.).

func NewFmtProvider

func NewFmtProvider(config ProviderConfig) LoggerProvider

NewFmtProvider создает новый экземпляр fmtProvider с заданной конфигурацией. Возвращает интерфейс LoggerProvider для использования в системе логирования.

type ProviderConfig

type ProviderConfig struct {
	LoggerConfig       // Embedded base logger configuration
	Level        Level // Provider-specific log level
}

ProviderConfig extends LoggerConfig with provider-specific settings. Embeds common configuration and adds provider-specific parameters.

Jump to

Keyboard shortcuts

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