Skip to content

クイックスタート

1. ロガーの作成

DD は様々なシナリオに対応する複数のコンビニエンスコンストラクタを提供します:

go
package main

import (
    "log"

    "github.com/cybergodev/dd"
)

func main() {
    // 方法 1:デフォルトグローバルロガー(ゼロ設定)
    dd.Info("グローバルロガーを使用")

    // 方法 2:開発モード(DEBUG レベル、caller 付き)
    dev, err := dd.New(dd.DevelopmentConfig())
    if err != nil {
        log.Fatal(err)
    }
    defer dev.Close()
    dev.Info("開発モード出力")

    // 方法 3:ファイル出力
    file, err := dd.New(dd.Config{
        Targets: []dd.OutputTarget{dd.FileOutput("logs/app.log")},
    })
    if err != nil {
        log.Fatal(err)
    }
    defer file.Close()
    file.Info("ファイル出力")

    // 方法 4:コンソールとファイルの同時出力
    all, err := dd.New(dd.Config{
        Targets: []dd.OutputTarget{
            dd.ConsoleOutput(),
            dd.FileOutput("logs/app.log"),
        },
    })
    if err != nil {
        log.Fatal(err)
    }
    defer all.Close()
    all.Info("デュアル出力先")

    // 方法 5:JSON フォーマット デュアル出力先
    jsonLogger, err := dd.New(dd.Config{
        Format: dd.FormatJSON,
        Targets: []dd.OutputTarget{
            dd.ConsoleOutput(),
            dd.FileOutput("logs/app.json"),
        },
    })
    if err != nil {
        log.Fatal(err)
    }
    defer jsonLogger.Close()
    jsonLogger.Info("JSON フォーマット出力")
}

ゼロ値 Config の落とし穴

上記の方法 3/4/5 は dd.Config{...} リテラルを直接使用しており、Targets/Format のみを明示的に設定し、残りのフィールドはゼロ値のままです:Level=Debug(フィルタなし)、IncludeTime=false(タイムスタンプなし)、IncludeLevel=false(レベルなし)、DynamicCaller=false(呼び出し元なし)、Security=nilDefaultSecurityConfig() の基本フィルタにフォールバックし、約 36 パターンのマスキングが有効なまま。無効化するには &dd.SecurityConfig{} または SecurityLevelDevelopment を明示的に指定する必要があります)。出力にはタイムスタンプやレベルなどの重要な情報が欠落します。

本番推奨dd.DefaultConfig() をベースにしてフィールドを変更すると、タイムスタンプ、レベル、呼び出し元、デフォルトセキュリティフィルタを一度に取得できます:

go
cfg := dd.DefaultConfig()                 // Level=Info, Format=Text, 時間/レベル/caller/Security 含む
cfg.Targets = []dd.OutputTarget{dd.FileOutput("logs/app.log")}
logger, err := dd.New(cfg)

同様に、dd.DevelopmentConfig()(DEBUG+caller)と dd.JSONConfig()(DEBUG+JSON+RFC3339)も、完全なフィールドセットが事前設定された便利な起点です。

2. ログレベル

DD は 5 つのログレベルをサポートします。低い方から高い方へ:

go
dd.Debug("デバッグ情報")   // LevelDebug
dd.Info("一般情報")    // LevelInfo(デフォルト)
dd.Warn("警告情報")    // LevelWarn
dd.Error("エラー情報")   // LevelError
dd.Fatal("致命的エラー")   // LevelFatal(os.Exit を呼び出し)

フォーマット版:

go
dd.Debugf("ユーザー %s がログイン、所要時間 %dms", name, elapsed)
dd.Infof("リクエスト処理完了:status=%d", status)
dd.Warnf("接続プール使用率 %d%%", usage)
dd.Errorf("データベースクエリ失敗: %v", err)

3. 構造化ログ

型安全なフィールドコンストラクタを使用:

go
dd.InfoWith("リクエスト処理完了",
    dd.String("method", "GET"),
    dd.String("path", "/api/users"),
    dd.Int("status", 200),
    dd.Duration("elapsed", 150*time.Millisecond),
)

出力例(デフォルトテキストフォーマット):

text
[2026-04-16T21:16:48+08:00   INFO] main.go:13 リクエスト処理完了 method=GET path=/api/users status=200 elapsed=150ms

JSON フォーマット出力

デフォルトのグローバルロガーはテキストフォーマットを使用します。JSON フォーマット出力が必要な場合は、dd.New(dd.JSONConfig()) で JSON フォーマットのロガーを作成してください。

4. フィールドのチェーン渡し

go
// プリセットフィールド付き Entry を作成
requestLogger := dd.WithFields(
    dd.String("service", "api-gateway"),
    dd.String("version", "1.0.0"),
)

// 各ログ出力にプリセットフィールドが自動付与される
requestLogger.Info("サービス起動")
requestLogger.InfoWith("ルート登録完了",
    dd.Int("routes", 42),
)

5. ファイルローテーション

FileWriter でローテーションポリシーを設定:

go
// デフォルト 100MB、30 日、10 バックアップ
fwCfg := dd.DefaultFileWriterConfig()
fwCfg.MaxBackups = 3
fwCfg.MaxSizeMB = 1
fwCfg.Compress = true

fw, err := dd.NewFileWriter("logs/app.log", fwCfg)
if err != nil {
    log.Fatal(err)
}
logger, err := dd.New(dd.Config{
    Level: dd.LevelInfo,
    Targets: []dd.OutputTarget{dd.CustomOutput(fw)},
})
if err != nil {
    log.Fatal(err)
}
defer logger.Close()

logger.Info("hello world")

6. 機密データフィルタリング

DD はデフォルトで基本機密データフィルタリングが有効(パスワード、API Key、クレジットカード番号などが自動マスキング):

go
// デフォルト設定には基本セキュリティフィルタリングが含まれる
logger, err := dd.New(dd.DefaultConfig())
if err != nil {
    log.Fatal(err)
}
defer logger.Close()

// パスワードフィールドは自動マスキング
logger.InfoWith("ユーザーログイン",
    dd.String("username", "admin"),
    dd.String("password", "s3cr3t"),  // 出力:[REDACTED]
)

次のステップ