
๋ค์ด๊ฐ๋ฉฐ
24์๊ฐ ์๋ฒ๋ฅผ ์ด์ํ๋ ์ค๋ฌดํ๊ฒฝ์์๋ ์ธ์ ์ด๋ค ์์ธ๊ฐ ๋ฐ์ํ ์ง ๋ชจ๋ฆ ๋๋ค. ์ด๋ฏธ ์ด์๊ฐ ๋ฐ์ํ ์ํ์์ ๊ธฐ์ ์๋ค์ด ์ ์ผ ๋จผ์ ํ์ธํ๋ ๊ฒ๋ค์ "๋ก๊ทธ"์ ๋๋ค. ๋ชจ๋ ์์คํ ์๋ ์ด๋ฒคํธ ๋ฐ์์ ๋ก๊ทธ๋ฅผ ์ฐ๊ฒ ๋๊ธฐ ๋๋ฌธ์, ์ธ์ด์ ํ๋ ์์ํฌ ๋ฑ ํ๊ฒฝ์ด ๋ฐ๋๋๋ผ๋ ๋ณด๊ธฐ ํธํ๊ฒ ๋ก๊ทธ ํ๊ฒฝ ์ค์ ๋ถํฐ ํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ ๋๋ค.
lorus
go์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก logํจํค์ง๊ฐ ์๊ธฐ ๋๋ฌธ์ ํ ์ดํ๋ก์ ํธ์์๋ logํจํค์ง๋ง ์ฌ์ฉํด๋ ๋ฉ๋๋ค. ํ์ง๋ง ์ฐ๋ฆฌ๋ ์ค๋ฌดํ๊ฒฝ์์ ์ฌ์ฉํด์ผํ๊ธฐ ๋๋ฌธ์ ์กฐ๊ธ๋ ๋ง์ ๊ธฐ๋ฅ์ ์ง์ํ๋ ์๋ํํฐ ํจํค์ง๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค. logrus๋ go์ log ํจํค์ง์ ํธํ๋๋ฉด์ ์์ ์งํฉ์ฒด๋ผ๊ณ ๋ณผ ์ ์์ต๋๋ค.(๊ณต์ ๋งํฌ)
go get -u github.com/sirupsen/logrus
์๋์ ๊ฐ์ด ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค.
package main
import (
"os"
"github.com/sirupsen/logrus"
)
var log = logrus.New()
func main() {
// ๋ก๊ทธ ์ถ๋ ฅ ํฌ๋งท ์ค์
log.SetFormatter(&logrus.TextFormatter{
FullTimestamp: true,
})
// ๋ก๊ทธ ์ถ๋ ฅ ์์น
log.SetOutput(os.Stdout)
// ๋ก๊ทธ ๋ ๋ฒจ ์ค์
log.SetLevel(logrus.DebugLevel)
log.Debug("๋๋ฒ๊ทธ ๋ก๊ทธ์
๋๋ค.")
log.Info("์ ๋ณด ๋ก๊ทธ์
๋๋ค.")
log.Warn("๊ฒฝ๊ณ ๋ก๊ทธ์
๋๋ค.")
log.Error("์๋ฌ ๋ก๊ทธ์
๋๋ค.")
}
lumberjack
lumberjack์ ๋ก๊ทธ ํ์ผ ์ ์ฅ ๊ธฐ๊ฐ, ์ฉ๋, ๋ก๊ทธ ๋กํ ์ด์ , ํ์ผ ์ ์ฅ ๋ฑ์ ํธ์ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. (๊ณต์ ๋งํฌ)
go get github.com/natefinch/lumberjack
package main
import (
"github.com/sirupsen/logrus"
"gopkg.in/natefinch/lumberjack.v2"
)
func main() {
log := logrus.New()
// ํ์ผ ํ์ ์ค์
log.SetOutput(&lumberjack.Logger{
Filename: "logs/app.log",
MaxSize: 10, // MB
MaxBackups: 5,
MaxAge: 7, // days
Compress: true,
})
log.SetFormatter(&logrus.JSONFormatter{}) // JSON ํฌ๋งท
log.SetLevel(logrus.InfoLevel)
log.Info("์๋ฒ ์์")
log.Warn("๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ๋์")
log.Error("DB ์ฐ๊ฒฐ ์คํจ")
}
์ต์ข ์ธํ
logger ํจํค์ง ๋ด logger.go ๋ชจ๋ ํ์ผ์ ์์ฑํ๊ณ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํฉ๋๋ค.
// Package logger
package logger
import (
"io"
"os"
"github.com/sirupsen/logrus"
"gopkg.in/natefinch/lumberjack.v2"
)
var Log = InitLogger("dev")
func InitLogger(env string) *logrus.Logger {
log := logrus.New()
log.SetOutput(io.MultiWriter(
os.Stdout,
&lumberjack.Logger{
Filename: "logs/myapp.log",
MaxSize: 10, // MB
MaxBackups: 5,
MaxAge: 7, // days
Compress: true,
}))
log.SetFormatter(&logrus.TextFormatter{
FullTimestamp: true,
TimestampFormat: "2006-01-02 15:04:05",
ForceColors: true,
})
log.SetReportCaller(true)
log.SetLevel(logrus.InfoLevel)
return log
}
func Info(args ...interface{}) { Log.Info(args...) }
func Warn(args ...interface{}) { Log.Warn(args...) }
func Error(args ...interface{}) { Log.Error(args...) }
func Debug(args ...interface{}) { Log.Debug(args...) }
func Infof(f string, a ...interface{}) { Log.Infof(f, a...) }
func Warnf(f string, a ...interface{}) { Log.Warnf(f, a...) }
func Errorf(f string, a ...interface{}) { Log.Errorf(f, a...) }
func Debugf(f string, a ...interface{}) { Log.Debugf(f, a...) }
logrus์ SetFormatter์ ์ธ์๋ฅผ &logrus.JSONFormatter{} ํํ๋ก ์ค์ ํ๋ ๊ฒฝ์ฐ๋ ๋ง์ต๋๋ค. ์ ๋ ์ปค์คํ ํ ์คํธ ํฌ๋งท์ผ๋ก ์งํํ์ต๋๋ค. TimestampFormat์ ๋ค์ด๊ฐ๋ ๊ฐ์ Go์ ๊ณ ์ ๋ time layout ํจํด์ด๊ธฐ ๋๋ฌธ์ ์์๋ก ๋ณ๊ฒฝํ์ง ์๋ ๊ฒ์ด ์ข์ต๋๋ค(์ ๊ธฐ).
๊ทธ๋ฆฌ๊ณ ๋ก๊ฑฐ ๋ชจ๋ ํ๋จ์ wrapping ํจ์๋ฅผ ์ด์ฉํ์ฌ ์ธ๋ถ ํจํค์ง์์ logger.Info(...)์ ๊ฐ์ด ์ฌ์ฉํด๋ ๋์ง๋ง, ๋ก๊ทธ๋ฅผ ํธ์ถํ ํ์ผ ์ ๋ณด๋ฅผ ๋จ๊ธฐ๋ SetReportCaller์์ ๋ชจ๋ logger.wrappingํจ์๋ง ๊ฐ๋ฆฌํค๊ณ ์์ด์ ์ ๋ logger.Log.Info(...)์ ๊ฐ์ด ํธ์ถํ ๊ณํ์ ๋๋ค.
๋, SetOutput์ ์ค์ ์์ io.MultiWriter์ Stdout๊ณผ lumberjack๋ฅผ ๊ฐ์ด ๋ฃ์ด์ ๋ก๊ทธํ์ผ write๊ณผ ์ฝ์์ถ๋ ฅ๊น์ง ๊ฐ๋ฅํ๊ฒ ํ์ต๋๋ค.
main์์ loging ํ ์คํธ๋ฅผ ํด๋ด ๋๋ค.
package main
import (
"fmt"
"runtime"
"myapp/logger"
)
func main() {
logger.Log.Infof("=== Go Trading Bot ===")
logger.Log.Infof("Go Version: %s\n", runtime.Version())
logger.Log.Infof("OS/Arch: %s/%s\n", runtime.GOOS, runtime.GOARCH)
logger.Log.Infof("Environment configured successfully!")
}
INFO[2025-11-10 14:44:24]/home/user/myapp/main.go:11 main.main() === Go Trading Bot ===
INFO[2025-11-10 14:44:24]/home/user/myapp/main.go:12 main.main() Go Version: go1.24.10
INFO[2025-11-10 14:44:24]/home/user/myapp/main.go:13 main.main() OS/Arch: linux/amd64
INFO[2025-11-10 14:44:24]/home/user/myapp/main.go:14 main.main() Environment configured successfully!
log/myapp์๋ ๋ก๊ทธํ์ผ์ ๋ด์ฉ์ด ์ฐ์ฌ์ง๋ฉด์ ์ฝ์์๋ ์ถ๋ ฅ๋ฉ๋๋ค.
'ํ๋ก๊ทธ๋๋ฐ ์ธ์ด > Go' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [Go] enum ์ฌ์ฉํ๊ธฐ (0) | 2025.11.10 |
|---|---|
| [Go] ์ผ์ ์๊ฐ๋ง๋ค ์ค์ผ์ค๋ฌ ๋์ํ๊ธฐ(Ticker) (0) | 2025.11.07 |
| [Go] ํ์์ง์ ์ Format ์ ๋ฆฌ(%v,%s,%d ๋ฑ) (0) | 2025.11.07 |
| [Go] Map ์๋ฆฌ์ ํ์ฉ(feat. hash) (0) | 2025.11.05 |
| [Go] ์ฌ๋ผ์ด์ค(slice)์๋ ํฌ์ธํฐ๊ฐ ์๋ค (0) | 2025.10.14 |
๋๊ธ