Skip to content

よくある質問

基本的な使い方

グローバルロガーとカスタムロガーの違いは?

グローバルロガーdd.Info() などのパッケージレベル関数で直接使用し、シンプルなシナリオに適しています。カスタムロガーdd.New() で作成し、独立した設定とライフサイクル管理をサポートします。

go
// グローバルロガー
dd.Info("グローバルログ")

// カスタムロガー
logger, _ := dd.New(dd.JSONConfig())
logger.Info("独立ログ")

プログラム起動時にグローバルロガーを初期化するには?

go
func init() {
    err := dd.InitDefault(dd.JSONConfig())
    if err != nil {
        log.Fatal(err)
    }
}

または SetDefault で設定:

go
logger, _ := dd.New(dd.Config{
    Format: dd.FormatJSON,
    Targets: []dd.OutputTarget{
        dd.ConsoleOutput(),
        dd.FileOutput("logs/app.json"),
    },
})
dd.SetDefault(logger)

Fatal レベルのログはどうなりますか?

Fatal / Fatalf / FatalWith はログ出力後に os.Exit(1) を呼び出します(defer 文は実行されません;内部でまず Close() を試みて保留中のログをフラッシュし、最長 5 秒待機します)。FatalHandler で終了動作をカスタマイズできます;リソースクリーンアップが必要な場合は ErrorWith + 明示的な Shutdown(ctx) を使用してください。

設定

コンソールとファイルに同時出力するには?

go
logger, _ := dd.New(dd.Config{
    Targets: []dd.OutputTarget{
        dd.ConsoleOutput(),
        dd.FileOutput("logs/app.log"),
    },
})
// または JSON フォーマット
logger, _ := dd.New(dd.Config{
    Format: dd.FormatJSON,
    Targets: []dd.OutputTarget{
        dd.ConsoleOutput(),
        dd.FileOutput("logs/app.json"),
    },
})

ログレベルを動的に変更するには?

go
_ = logger.SetLevel(dd.LevelDebug)  // 実行時に変更(error を返す)
_ = dd.SetLevel(dd.LevelDebug)      // グローバルロガーのレベルを変更

ファイルローテーションポリシーを設定するには?

FileWriter で設定:

go
fw, _ := dd.NewFileWriter("logs/app.log",
    dd.DefaultFileWriterConfig(),  // 100MB、30 日、10 バックアップ
)

パフォーマンス

ログはプログラムのパフォーマンスに影響しますか?

DD は高いパフォーマンスを目指して設計されています:

  • ホットパスでの低アロケーション最適化
  • アトミックレベルチェック、ロックなし
  • 大きい入力(≥10KB)の機密データフィルタリングは独立した goroutine で実行されタイムアウト保護付き;小さい入力は同期処理
  • オプションのバッファリングで I/O を削減

高スループット環境での最適化方法は?

  1. BufferedWriter を使用して I/O を削減
  2. レベルチェックを先に行ってからフィールドを構築
  3. ログサンプリングの有効化を検討
  4. 高頻度パスでの Any フィールドの使用を避ける

詳細は パフォーマンス最適化 を参照。

セキュリティ

機密データフィルタリングの仕組みは?

SensitiveDataFilter は正規表現パターンマッチングを使用し、ログ書き込み前に一致した機密値を [REDACTED] に自動置換します。小さい入力は同期的に処理し、大きい入力は独立した goroutine でタイムアウト保護付きで実行されるため、ログ書き込みをブロックしません。

カスタム機密データパターンを追加するには?

go
filter, _ := dd.NewCustomSensitiveDataFilter(
    `(?i)my_secret_field\s*[:=]\s*\S+`,
)

ログの改ざんを防ぐには?

IntegritySigner を使用してログに HMAC 署名:

go
cfg, _ := dd.DefaultIntegrityConfigSafe()
signer, _ := dd.NewIntegritySigner(cfg)
sig := signer.Sign(logMessage)
// 検証:signer.Verify(signedEntry)

エラー処理

AddWriter がエラーを返す理由は?

考えられる原因:

  • ErrNilWriter -- nil Writer が渡された
  • ErrLoggerClosed -- ロガーが既に閉じている
  • ErrMaxWritersExceeded -- Writer 数が上限を超えている

書き込み失敗を処理するには?

go
logger.SetWriteErrorHandler(func(w io.Writer, err error) {
    // カスタム処理
    metrics.WriteErrors.Inc()
})

テスト

テストでログをキャプチャするには?

LoggerRecorder を使用:

go
rec := dd.NewLoggerRecorder()
logger, _ := rec.NewLogger()

logger.Info("test")

if !rec.ContainsMessage("test") {
    t.Error("期待されるログが見つかりません")
}

詳細は テスト補助 を参照。

次のステップ