よくある質問
基本的な使い方
グローバルロガーとカスタムロガーの違いは?
グローバルロガーは 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 を削減
高スループット環境での最適化方法は?
BufferedWriterを使用して I/O を削減- レベルチェックを先に行ってからフィールドを構築
- ログサンプリングの有効化を検討
- 高頻度パスでの
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("期待されるログが見つかりません")
}詳細は テスト補助 を参照。
次のステップ
- クイックスタート -- 入門ガイド
- API リファレンス -- 完全 API
- 本番チェックリスト -- リリース前チェック