Skip to content

Конфигурация

DD использует конфигурацию на основе структур (Config) с поддержкой автодополнения в IDE — не нужны цепочки билдеров или функции-опции. Это руководство охватывает все поля конфигурации и распространённые комбинации.

Справочник по API: см. Config для полного списка полей.

Три пресета

ПресетУровеньФорматФильтр безопасностиТипичное использование
DefaultConfig()InfoТекст✅ БазовыйПо умолчанию для production
DevelopmentConfig()DebugТекст (короткое время)✅ БазовыйЛокальная разработка
JSONConfig()DebugJSON (RFC3339)✅ БазовыйСистемы агрегации логов

Предупреждение Фильтр безопасности включён по умолчанию

Все три пресета включают базовую фильтрацию конфиденциальных данных (пароли, API-ключи, номера кредитных карт и т.д.). Даже в режиме разработки она остаётся включённой — чтобы своевременно выявлять случайные утечки конфиденциальных данных. Для отключения явно установите Security: &dd.SecurityConfig{} или используйте SecurityLevelDevelopment.

Обзор полей Config

go
type Config struct {
    // ─── Базовое ───
    Level         LogLevel     // Уровень логирования (LevelDebug ~ LevelFatal)
    Format        LogFormat    // Формат вывода (FormatText / FormatJSON)
    TimeFormat    string       // Формат времени (по умолчанию ISO 8601)
    IncludeTime   bool         // Включать временную метку
    IncludeLevel  bool         // Включать уровень логирования

    // ─── Информация о вызывающем ───
    DynamicCaller bool         // Динамическое определение вызывающего (file:line)
    FullPath      bool         // Использовать полный путь к файлу (по умолчанию: только имя файла)

    // ─── Целевые назначения вывода ───
    Targets       []OutputTarget // Целевые назначения вывода (ConsoleOutput/FileOutput/CustomOutput)

    // ─── Настройка формата ───
    JSON          *JSONOptions // Настройки JSON-формата (имена полей, отступы и т.д.)

    // ─── Безопасность ───
    Security      *SecurityConfig       // Конфигурация безопасности (фильтрация, ограничение частоты)
    FieldValidation *FieldValidationConfig // Проверка именования ключей Field

    // ─── Жизненный цикл ───
    FatalHandler      FatalHandler      // Пользовательский обработчик Fatal
    WriteErrorHandler WriteErrorHandler // Callback при ошибке записи

    // ─── Расширения ───
    ContextExtractors []ContextExtractor // Экстракторы Field из контекста
    Hooks             *HookRegistry      // Хуки жизненного цикла
    Sampling          *SamplingConfig    // Сэмплирование логов

    // ─── Аудит ───
    Audit             *AuditConfig       // Логирование аудита безопасности
}

Настройка целевых назначений вывода

Используйте ConsoleOutput(), FileOutput(), CustomOutput() для создания целевых назначений вывода:

go
package main

import (
    "log"
    "os"

    "github.com/cybergodev/dd"
)

func main() {
    cfg := dd.DefaultConfig()
    cfg.Targets = []dd.OutputTarget{
        dd.ConsoleOutput(),                          // Консоль
        dd.FileOutput("logs/app.log"),               // Файл (по умолчанию 100МБ/10 резервных копий/30 дней)
        dd.CustomOutput(os.Stderr),                  // Пользовательский Writer
    }

    // Пользовательские параметры ротации файлов
    fileTarget := dd.FileOutput("logs/app.log")
    fileTarget.MaxSizeMB = 50     // Ротация при 50МБ
    fileTarget.MaxBackups = 5     // Хранить 5 резервных копий
    fileTarget.MaxAge = 7 * 24    // Хранить 7 дней

    logger, err := dd.New(cfg)
    if err != nil {
        log.Fatal(err)
    }
    defer logger.Close()
}

Подсказка Подводный камень нулевого значения Config

Использование dd.Config{Targets: ...} напрямую пропускает временные метки, уровень и информацию о вызывающем. Всегда начинайте с dd.DefaultConfig() и изменяйте нужные поля.

Настройка JSON-формата

go
cfg := dd.JSONConfig()

// Пользовательские имена полей JSON
cfg.JSON = &dd.JSONOptions{
    PrettyPrint: true,
    Indent:      "  ",
    FieldNames: &dd.JSONFieldNames{
        Timestamp: "@timestamp",
        Level:     "severity",
        Message:   "msg",
        Caller:    "source",
        Fields:    "ctx",
    },
}

Конфигурация безопасности

go
cfg := dd.DefaultConfig()

// Вариант A: по уровню безопасности (рекомендуется)
cfg.Security = dd.SecurityConfigForLevel(dd.SecurityLevelStandard)

// Вариант B: отраслевые пресеты
cfg.Security = dd.HealthcareConfig()   // HIPAA
cfg.Security = dd.FinancialConfig()    // PCI-DSS
cfg.Security = dd.GovernmentConfig()   // Государственный сектор

// Вариант C: пользовательская конфигурация
cfg.Security = &dd.SecurityConfig{
    MaxMessageSize: 1024 * 1024, // 1МБ
    SensitiveFilter: dd.NewSensitiveDataFilter(),
}

См. Фильтрация конфиденциальных данных и Обзор безопасности.

Валидация Field

go
cfg := dd.DefaultConfig()
cfg.FieldValidation = dd.StrictSnakeCaseConfig()
// Все ключи Field должны быть snake_case, иначе предупреждение в stderr

См. Валидация Field.

Сэмплирование логов

go
cfg := dd.DefaultConfig()
cfg.Sampling = &dd.SamplingConfig{
    Enabled:    true,
    Initial:    100,            // Первые 100 записей всегда логируются
    Thereafter: 10,             // Затем логируется 1 из каждых 10
    Tick:       time.Second,    // Сброс счётчика каждую секунду
}

См. Сэмплирование логов.

Хуки и аудит

go
// Хуки
registry := dd.NewHooksFromConfig(dd.HooksConfig{
    AfterLog: []dd.Hook{func(ctx context.Context, hc *dd.HookContext) error {
        // Отправка в систему метрик
        return nil
    }},
})
cfg.Hooks = registry

// Аудит
cfg.Audit = &dd.AuditConfig{
    Enabled:     true,
    Output:      auditFile,
    JSONFormat:  true,
    MinimumSeverity: dd.AuditSeverityWarning,
}

См. Система Hook и Логирование аудита.

Clone: глубокое копирование конфигурации

Clone() создаёт копию конфигурации, что полезно для создания разных конфигураций на основе одной базовой:

go
base := dd.DefaultConfig()
base.Format = dd.FormatJSON

// Вариант 1: конфигурация для production
prodCfg := base.Clone()
prodCfg.Level = dd.LevelInfo
prodCfg.Targets = []dd.OutputTarget{dd.FileOutput("logs/prod.log")}

// Вариант 2: конфигурация для отладки
debugCfg := base.Clone()
debugCfg.Level = dd.LevelDebug
debugCfg.Targets = []dd.OutputTarget{dd.ConsoleOutput()}

// base остаётся без изменений

Подсказка Глубина копирования Clone

Глубокое копирование: JSON, Security, Hooks, Sampling, Audit, срез Targets. Поверхностное копирование: FatalHandler, WriteErrorHandler, FieldValidation (функции/указатели разделяются). Срез ContextExtractors копируется, но экземпляры экстракторов разделяются.

Следующие шаги