[Go] slog로 로컬에 파일 저장하기 with lumberjack

nzero·2024년 2월 29일

Where is the Book

목록 보기
6/6

lumberjack 설정

로그 파일 저장 기간, 용량 등을 설정하여 서버에 혹시 모를 용량 부족을 편하게 해결할 수 있다. 서버 실행 일자로 로그 파일을 생성하도록 설정해줬다.

// logger. go

... 생략 ...
var lumberjackLogger = &lumberjack.Logger{
	Filename:   getLogFilePath(),
	MaxSize:    20,   // A file can be up to 20M.
	MaxBackups: 5,    // Save up to 5 files at the same time
	MaxAge:     10,   // A file can be saved for up to 10 days.
	Compress:   true, // Compress with gzip.
}

func getLogFilePath() string {
	logPath := os.Getenv("LOG_PATH")
	logFileName := time.Now().Format("2006-01-02") + ".log"

	fileName := filepath.Join(logPath, logFileName)
	if _, err := os.Stat(fileName); err != nil {
		if _, err := os.Create(fileName); err != nil {
			log.Println(err.Error())
		}
	}
	return fileName
}
... 생략 ...

slog 설정

편의를 위해 logger.go 파일로 로거를 분리했다.

우선 slog부터 설정해준다. formatter로 시간대를 설정하고, cli와 로컬에 모두 내보내기 위해 multiout을 사용했다.

들어오는 요청 분석을 위해 req body도 같이 기록하도록 설정했다.

// logger.go

... 생략 ...
var SlogLogger = slog.New(
	slogmulti.Fanout(
		slog.NewJSONHandler(os.Stdout, nil),
        slog.NewJSONHandler(lumberjackLogger, nil),
	),
)

var SlogConfig = slogecho.Config{
	WithRequestBody: true,
	WithRequestHeader:  true,
	WithResponseHeader: true,
}

var seoulTime, _ = time.LoadLocation("Asia/Seoul")
... 생략 ...

echo에 로거 설정

slogecho 미들웨어가 있으므로 편하게 설정 가능하다. 앞서 설정했던 logger와 config를 넘겨준다.

... 생략 ...
	e := echo.New()

	e.Use(slogecho.NewWithConfig(utils.SlogLogger, utils.SlogConfig))
	e.Use(middleware.Recover())
... 생략 ...

출력도 저장도 잘 되고있다

0개의 댓글