🦉 Logrus란?
logrus
는 golang
에서 사용할 수 있는 로깅 모듈 중의 하나로, docker와 Prometheus와 같은 많은 유명 오픈 소스 프로젝트가 이를 사용하여 로그를 기록하는 것으로 알려져 있다.
Logrus의 특징
golang
표준 라이브러리의 로깅 모듈과 완벽하게 호환된다. logrus
에는 6가지의 로그 레벨이 존재하며, 이는 golang 표준 라이브러리의 로그 모듈 API의 상위 집합이다. 프로젝트에서 표준 라이브러리의 log 모듈을 사용하는 경우, 저렴한 비용으로 logrus로 마이그레이션 할 수 있다.
- 확장 가능한 hook 매커니즘 : 사용자가 hook을 통해 로컬 파일 시스템, 표준 출력, logstash, elastic search또는 MQ와 같은 위치에 로그를 배포하거나 hook을 통해 로그 내용 및 형식을 정의할 수 있다.
- 선택적 로그 출력 형식 : logrus에는 jsonformatter 및 textformatter의 두 가지 기본 제공 로그 형식이 있다. 이 두 형식적이라도 충분하지 않은 경우 인터페이스 포메터를 직접 구현하여 로그 형식을 정의할 수도 있다.
- 필드 매커니즘 : logrus는 긴 메세지를 통한 로깅보다 필드 매커니즘을 통해 상세하고 구조화된 로깅을 지원하고 권장한다.
Logrus 사용 예시
go get -u github.com/sirupsen/logrus
Logrus를 사용하는 간단한 예
package main
import log "github.com/sirupsen/logrus"
func main() {
log.WithFields(log.Fields{
"animal": "tiger",
"habitat": "mountain",
}).Info("A tiger appears")
}
}
logrus 로그의 7단계
log.Trace("Something very low level.")
log.Debug("Userful debugging information.")
log.Info("Something noteworthy happend!")
log.Warn("You should probably take a look at this")
log.Error("Something failed but I'm not quitting.")
log.Fatal("Bye.")
log.Panic("I'm bailing.")
다양한 옵션 설정 가능
package main
import (
log "github.com/sirupsen/logrus"
"os"
)
func init() {
log.SetFormatter(&log.JSONFormatter{})
log.SetOutput(os.Stdout)
log.SetLevel(log.WarnLevel)
}
func logrusOne() {
log.WithFields(log.Fields{
"animal": "tiger",
"distance": 100,
}).Info("A tiger appears")
log.WithFields(log.Fields{
"animal": "tiger",
"distance": 10,
}).Warn("A tiger coming to you")
log.WithFields(log.Fields{
"animal": "tiger",
"distance": 0,
}).Fatal("A tiger wants to play with you... Good Luck...")
}
func main() {
logrusOne()
}
결과

logrus는 log인스턴스를 정의하여, 각 인스턴스에 대해서 다른 옵션을 적용하는 것도 가능하게 한다.
package main
import (
log "github.com/sirupsen/logrus"
"os"
)
var (
logInstanceOne = log.New()
logInstanceTwo = log.New()
)
func init() {
logInstanceOne.Out = os.Stdout
logInstanceTwo.Out = os.Stderr
logInstanceOne.Formatter = &log.JSONFormatter{}
logInstanceTwo.Formatter = &log.TextFormatter{}
}
func main() {
logInstanceOne.WithFields(log.Fields{
"animal": "tiger",
"habitat": "mountain",
}).Info("A tiger appears")
logInstanceTwo.WithFields(log.Fields{
"animal": "tiger",
"habitat": "mountain",
}).Info("A tiger appears")
}
결과

Reference