로그 파일 저장 기간, 용량 등을 설정하여 서버에 혹시 모를 용량 부족을 편하게 해결할 수 있다. 서버 실행 일자로 로그 파일을 생성하도록 설정해줬다.
// 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
}
... 생략 ...
편의를 위해 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")
... 생략 ...
slogecho 미들웨어가 있으므로 편하게 설정 가능하다. 앞서 설정했던 logger와 config를 넘겨준다.
... 생략 ...
e := echo.New()
e.Use(slogecho.NewWithConfig(utils.SlogLogger, utils.SlogConfig))
e.Use(middleware.Recover())
... 생략 ...
출력도 저장도 잘 되고있다

