Skip to content

Logger

Logger는 DD 의 핵심 타입으로, 스레드 안전한 로깅 기능을 제공합니다.

생성

go
// New 로 생성
logger, _ := dd.New(dd.DefaultConfig())
go
// 커스텀 구성으로 생성
logger, _ := dd.New(dd.Config{
    Level: dd.LevelInfo,
    Targets: []dd.OutputTarget{
        dd.ConsoleOutput(),
        dd.FileOutput("logs/app.log"),
    },
})

로그 메서드

기본 로그

메서드설명
Debug(args ...any)Debug 레벨 로그
Info(args ...any)Info 레벨 로그
Warn(args ...any)Warn 레벨 로그
Error(args ...any)Error 레벨 로그
Fatal(args ...any)Fatal 레벨 로그 (기본적으로 os.Exit(1) 호출, defer 는 실행되지 않음; FatalHandler 로 사용자 정의 가능)
Log(level LogLevel, args ...any)지정 레벨 로그

포맷팅 로그

메서드설명
Debugf(format string, args ...any)포맷팅 Debug
Infof(format string, args ...any)포맷팅 Info
Warnf(format string, args ...any)포맷팅 Warn
Errorf(format string, args ...any)포맷팅 Error
Fatalf(format string, args ...any)포맷팅 Fatal(기본적으로 os.Exit(1) 호출, defer 는 실행되지 않음; FatalHandler 로 사용자 정의 가능)
Logf(level LogLevel, format string, args ...any)지정 레벨 포맷팅

구조화 로그

메서드설명
DebugWith(msg string, fields ...Field)구조화 Debug
InfoWith(msg string, fields ...Field)구조화 Info
WarnWith(msg string, fields ...Field)구조화 Warn
ErrorWith(msg string, fields ...Field)구조화 Error
FatalWith(msg string, fields ...Field)구조화 Fatal(기본적으로 os.Exit(1) 호출, defer 는 실행되지 않음; FatalHandler 로 사용자 정의 가능)
LogWith(level LogLevel, msg string, fields ...Field)구조화 지정 레벨
go
logger.InfoWith("요청 완료",
    dd.String("method", "GET"),
    dd.Int("status", 200),
    dd.Duration("elapsed", 100*time.Millisecond),
)

레벨 관리

go
level := logger.GetLevel()                    // 현재 레벨 가져오기
_ = logger.SetLevel(dd.LevelDebug)            // 레벨 설정
enabled := logger.IsLevelEnabled(dd.LevelInfo)// 레벨 확인

// 바로 가기 확인
logger.IsDebugEnabled()
logger.IsInfoEnabled()
logger.IsWarnEnabled()
logger.IsErrorEnabled()
logger.IsFatalEnabled()

// 동적 레벨 리졸버
logger.SetLevelResolver(func(ctx context.Context) dd.LogLevel {
    if isDebug {
        return dd.LevelDebug
    }
    return dd.LevelInfo
})
resolver := logger.GetLevelResolver()

필드 체인

go
// 사전 설정 필드, LoggerEntry 반환
entry := logger.WithFields(
    dd.String("service", "api"),
    dd.Int("version", 2),
)

// 단일 필드
entry := logger.WithField("env", "prod")

출력 대상 관리

go
// Writer 추가
_ = logger.AddWriter(os.Stderr)

// Writer 제거
_ = logger.RemoveWriter(os.Stderr)

// Writer 수 가져오기
count := logger.WriterCount()

// 쓰기 오류 핸들러 설정
logger.SetWriteErrorHandler(func(w io.Writer, err error) {
    fmt.Fprintf(os.Stderr, "쓰기 실패: %v\n", err)
})

컨텍스트 통합

go
// 컨텍스트 추출기 추가
_ = logger.AddContextExtractor(func(ctx context.Context) []dd.Field {
    return []dd.Field{
        dd.String("trace_id", dd.GetTraceID(ctx)),
    }
})

// 모든 추출기 교체
_ = logger.SetContextExtractors(extractor1, extractor2)

// 현재 추출기 가져오기
extractors := logger.GetContextExtractors()

훅 관리

go
// 훅 등록
_ = logger.AddHook(dd.HookBeforeLog, func(ctx context.Context, hc *dd.HookContext) error {
    // 로그 전 처리
    return nil
})

// 훅 레지스트리 교체
_ = logger.SetHooks(registry)

// 훅 레지스트리 가져오기
hooks := logger.GetHooks()

샘플링 제어

go
// 샘플링 구성 설정
logger.SetSampling(&dd.SamplingConfig{
    // 샘플링 매개변수
})

// 샘플링 구성 가져오기
cfg := logger.GetSampling()

보안 구성

go
// 보안 구성 설정
logger.SetSecurityConfig(dd.DefaultSecurityConfig())

// 보안 구성 가져오기
sec := logger.GetSecurityConfig()

필드 검증

go
// 필드 검증 설정
logger.SetFieldValidation(dd.StrictSnakeCaseConfig())

// 검증 구성 가져오기
validation := logger.GetFieldValidation()

라이프사이클

go
// 버퍼 flush
_ = logger.Flush()

// 로거 종료
_ = logger.Close()

// 우아한 종료 (타임아웃 포함)
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
_ = logger.Shutdown(ctx)

// 종료 여부 확인
closed := logger.IsClosed()

// 필터 goroutine 완료 대기
ok := logger.WaitForFilterGoroutines(3 * time.Second)
active := logger.ActiveFilterGoroutines()

디버그 출력

메서드설명
Print(args ...any)구성된 Writer 로 출력 (LevelInfo, 보안 필터 적용)
Println(args ...any)Print 와 동일 동작 (내부 Log() 가 자동 줄바꿈)
Printf(format string, args ...any)포맷팅 출력 (LevelInfo, 보안 필터 적용)
JSON(data ...any)stdout 으로 컴팩트 JSON 출력 (caller 정보 포함, 보안 필터 미적용)
JSONF(format string, args ...any)stdout 으로 포맷팅된 컴팩트 JSON 출력 (caller 정보 포함, 보안 필터 미적용)
Text(data ...any)stdout 으로 보기 좋게 출력 (caller 정보 미포함, 보안 필터 미적용)
Textf(format string, args ...any)stdout 으로 포맷팅된 텍스트 출력 (caller 정보 미포함, 보안 필터 미적용)

다음 단계