[Go] logrus : 더 자세한 로깅 모듈

홍승보·2023년 3월 9일
0

🦉 Logrus란?

  • logrusgolang에서 사용할 수 있는 로깅 모듈 중의 하나로, 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() {
	// 로그 형식을 JSON 형식으로 지정
    log.SetFormatter(&log.JSONFormatter{})
    
    // log 출력을 표준 출력으로 설정
    log.SetOutput(os.Stdout)
    
    // log 레벨을 warn단계 위로 설정
    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"
)

// Logrus 모듈에서는 new() 함수를 통해 logrus.Entry 인스턴스를 만들 수 있다.
// 프로젝트 내에서 원하는 수만큼 logrus.Entry인스턴스를 만들 수 있다.
var (
	logInstanceOne = log.New()
	logInstanceTwo = log.New()
)

func init() {
	// 생성한 logrus 인스턴스의 출력이 어떻게 이뤄질지를 결정한다.
	// logrus 인스턴스 출력은 io.writer라면 모두 가능하다.
	logInstanceOne.Out = os.Stdout
	logInstanceTwo.Out = os.Stderr

	// 생성한 logrus 인스턴스의 출력 형식이 어떻게 이뤄질지를 결정한다.
	// 이와 비슷하게, logrus 인스턴스 별로 "로그 레벨" 또는 "훅"을 설정할 수 있다.
	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

profile
Junior BE Developer

0개의 댓글