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(caller 없음), Security=nil(DefaultSecurityConfig() 기본 필터로 폴백, 약 36 종의 마스킹은 여전히 활성화됨; 완전히 끄려면 &dd.SecurityConfig{} 또는 SecurityLevelDevelopment 명시 필요). 출력에 타임스탬프와 레벨 같은 핵심 정보가 누락됩니다.

프로덕션 권장: dd.DefaultConfig()를 기반으로 필드를 수정하면 타임스탬프, 레벨, caller, 기본 보안 필터를 한 번에 얻을 수 있습니다.

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]
)

다음 단계