About logger #29
Replies: 3 comments
-
두 가지 Logger 적용 방식 중, 현재는 이유:
추후, 필요시 참고 from ChatGPTinit() 후 Blank Import 방식설명:
적합성:
Get() sync.Once 방식설명:
적합성:
어떤 방식이 적합한가?Go 프로그래밍에서 적합한 방식은 사용하는 패키지의 성격과 요구사항에 따라 다릅니다.
최종적으로, 프로젝트의 특정 요구사항과 패키지의 사용 방식에 따라 적절한 접근 방식을 선택해야 합니다. 참고 - Get() sync.Once 예제 코드 example - logger.go package logger
import (
"os"
"sync"
"github.com/rs/zerolog"
)
var (
once sync.Once
instance *zerolog.Logger
)
// InitLogger initializes the logger instance.
func InitLogger() *zerolog.Logger {
once.Do(func() {
// Customize the logger configuration as per your requirements
output := zerolog.ConsoleWriter{Out: os.Stdout}
logger := zerolog.New(output).With().Timestamp().Logger()
instance = &logger
})
return instance
}
// GetInstance returns the logger instance.
func GetInstance() *zerolog.Logger {
if instance == nil {
return InitLogger()
}
return instance
} example - main.go package main
import (
"yourapp/logger" // yourapp는 프로젝트의 경로에 따라 변경해주세요.
)
func main() {
log := logger.GetInstance()
// Use the logger
log.Info().Msg("Starting application...")
// Rest of your application code
} |
Beta Was this translation helpful? Give feedback.
-
Needs:
Consideration
I'm still not sure what the best practice is 😅. Help/feedback wanted. This will be discussed later. LoggerFactory - a hint from ChatGPT 여러 모듈에서 각기 다른 로그 레벨을 적용하려면, 각 모듈 별로 별도의 로거 인스턴스를 생성하고 관리해야 합니다. 각 로거 인스턴스는 해당 모듈의 로깅 요구사항에 맞게 개별적으로 설정될 수 있습니다. 이를 위해 로거 팩토리 패턴을 사용할 수 있으며, 이 패턴은 각 모듈이나 컴포넌트에 필요한 로거 인스턴스를 생성하는 데 도움을 줍니다. 아래는 로거 팩토리 패턴을 사용하여 다양한 로그 레벨을 갖는 로거 인스턴스를 생성하는 방법의 예시입니다: logger 패키지 개선logger/logger.go: package logger
import (
"os"
"sync"
"github.com/rs/zerolog"
)
var once sync.Once
// LoggerFactory는 다양한 로그 레벨의 로거를 생성합니다.
type LoggerFactory struct {
}
// NewLogger는 주어진 로그 레벨로 새로운 로거 인스턴스를 생성합니다.
func (f *LoggerFactory) NewLogger(level zerolog.Level) *zerolog.Logger {
output := zerolog.ConsoleWriter{Out: os.Stdout}
logger := zerolog.New(output).Level(level).With().Timestamp().Logger()
return &logger
}
// 기본 로거 팩토리 인스턴스
var defaultFactory *LoggerFactory
// GetFactory는 기본 로거 팩토리 인스턴스를 반환합니다.
func GetFactory() *LoggerFactory {
once.Do(func() {
defaultFactory = &LoggerFactory{}
})
return defaultFactory
} main 및 다른 모듈에서 로거 사용main.go: package main
import (
"yourapp/logger"
"github.com/rs/zerolog"
)
func main() {
// 로거 팩토리 인스턴스 가져오기
factory := logger.GetFactory()
// main 모듈을 위한 로거 생성
mainLogger := factory.NewLogger(zerolog.InfoLevel)
mainLogger.Info().Msg("Starting application...")
// 다른 모듈을 위한 로거 생성
otherModuleLogger := factory.NewLogger(zerolog.DebugLevel)
otherModuleLogger.Debug().Msg("This is a debug message from another module")
} 이 예제에서 |
Beta Was this translation helpful? Give feedback.
-
Golang의 logger들을 분석 후 zerolog를 도입할 당시, 그 동안,
#125 에서 Tracing-like functionalities가 적용되어 소기의 목적을 달성하였습니다.
Client(API 사용자)가 API 호출 시, x-request-id 를 전달한다면, 참고 - tracing-like 기능을 제공하는 것이기에, 정석적인 tracing 및 observerbility를 위해서는 OpenTelemetry 등의 활용이 필요할 것 입니다. 예정 사항: 필요한 서브시스템에 확대 적용 예정 (시점: 미정) |
Beta Was this translation helpful? Give feedback.
-
(결론부터, 일단은 Zerolog 를 써보는 것으로... 😅)
Logging in Go: A Comparison of the Top 9 Libraries
이중 성능이 좋은 Zerolog와 Zap를 조금 더 분석해 보았습니다.
Ref. Compare zerolog and zap's popularity and activity from LibHunt
Zerolog
좋은 점
아쉬운 점
logger
에 비해 타이핑 할 것이 많음Zap
좋은 점
logger
와 유사하게 간결한 사용 가능아쉬운 점
마지막으로 Echo Web Framework와 호환성 확인
Beta Was this translation helpful? Give feedback.
All reactions