Конфигурация
DD использует конфигурацию на основе структур (Config) с поддержкой автодополнения в IDE — не нужны цепочки билдеров или функции-опции. Это руководство охватывает все поля конфигурации и распространённые комбинации.
Справочник по API: см. Config для полного списка полей.
Три пресета
| Пресет | Уровень | Формат | Фильтр безопасности | Типичное использование |
|---|---|---|---|---|
DefaultConfig() | Info | Текст | ✅ Базовый | По умолчанию для production |
DevelopmentConfig() | Debug | Текст (короткое время) | ✅ Базовый | Локальная разработка |
JSONConfig() | Debug | JSON (RFC3339) | ✅ Базовый | Системы агрегации логов |
Предупреждение Фильтр безопасности включён по умолчанию
Все три пресета включают базовую фильтрацию конфиденциальных данных (пароли, API-ключи, номера кредитных карт и т.д.). Даже в режиме разработки она остаётся включённой — чтобы своевременно выявлять случайные утечки конфиденциальных данных. Для отключения явно установите Security: &dd.SecurityConfig{} или используйте SecurityLevelDevelopment.
Обзор полей Config
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() для создания целевых назначений вывода:
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-формата
cfg := dd.JSONConfig()
// Пользовательские имена полей JSON
cfg.JSON = &dd.JSONOptions{
PrettyPrint: true,
Indent: " ",
FieldNames: &dd.JSONFieldNames{
Timestamp: "@timestamp",
Level: "severity",
Message: "msg",
Caller: "source",
Fields: "ctx",
},
}Конфигурация безопасности
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
cfg := dd.DefaultConfig()
cfg.FieldValidation = dd.StrictSnakeCaseConfig()
// Все ключи Field должны быть snake_case, иначе предупреждение в stderrСм. Валидация Field.
Сэмплирование логов
cfg := dd.DefaultConfig()
cfg.Sampling = &dd.SamplingConfig{
Enabled: true,
Initial: 100, // Первые 100 записей всегда логируются
Thereafter: 10, // Затем логируется 1 из каждых 10
Tick: time.Second, // Сброс счётчика каждую секунду
}См. Сэмплирование логов.
Хуки и аудит
// Хуки
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() создаёт копию конфигурации, что полезно для создания разных конфигураций на основе одной базовой:
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 копируется, но экземпляры экстракторов разделяются.
Следующие шаги
- Базовые концепции -- Иерархия Logger и конвейер обработки
- Структурированное логирование -- Конструкторы Field и цепочки
- Справочник по API - Config -- Полная документация полей