제로 로그 의 send 에 대해 서 얘 기해 볼 게 요.
4403 단어 golang
본 고 는 주로 zerolog 의 send 를 연구 하고 자 한다.
실례
func sendDemo() {
zerolog.TimeFieldFormat = zerolog.TimeFormatUnix
log.Info().
Str("Name", "Tom").
Send()
log.Info().
Str("Name", "Tom").
Msg("hello world")
}
Send 나 Msg 를 사용 하여 log 를 보 냅 니 다.
출력
{"level":"info","Name":"Tom","time":1609509525}
{"level":"info","Name":"Tom","time":1609509525,"message":"hello world"}
Send
github.com/rs/[email protected]/event.go
// Send is equivalent to calling Msg("").
//
// NOTICE: once this method is called, the *Event should be disposed.
func (e *Event) Send() {
if e == nil {
return
}
e.msg("")
}
Send 방법 은 Msg(")에 해당 합 니 다.
msg
github.com/rs/[email protected]/event.go
func (e *Event) msg(msg string) {
for _, hook := range e.ch {
hook.Run(e, e.level, msg)
}
if msg != "" {
e.buf = enc.AppendString(enc.AppendKey(e.buf, MessageFieldName), msg)
}
if e.done != nil {
defer e.done(msg)
}
if err := e.write(); err != nil {
if ErrorHandler != nil {
ErrorHandler(err)
} else {
fmt.Fprintf(os.Stderr, "zerolog: could not write event: %v
", err)
}
}
}
msg 방법 은 hook 을 먼저 실행 한 다음 msg 가 있 는 message 필드 를 추가 합 니 다.done 이 nil 이 아니라면 defer 가 리 셋 을 등록 한 다음 에 e.write()를 실행 합 니 다.
write
github.com/rs/[email protected]/event.go
func (e *Event) write() (err error) {
if e == nil {
return nil
}
if e.level != Disabled {
e.buf = enc.AppendEndMarker(e.buf)
e.buf = enc.AppendLineBreak(e.buf)
if e.w != nil {
_, err = e.w.WriteLevel(e.level, e.buf)
}
}
putEvent(e)
return
}
write 는 level 이 Disabled 가 아 닐 때 endMarker 및 lineBreaker 를 추가 합 니 다.e.w 가 nil 이 아 닐 때 e.w.Write Level(e.level,e.buf)을 실행 하여 출력 합 니 다.이후 putEvent 반환 이벤트 실행
putEvent
github.com/rs/[email protected]/event.go
func putEvent(e *Event) {
// Proper usage of a sync.Pool requires each entry to have approximately
// the same memory cost. To obtain this property when the stored type
// contains a variably-sized buffer, we add a hard limit on the maximum buffer
// to place back in the pool.
//
// See https://golang.org/issue/23199
const maxSize = 1 << 16 // 64KiB
if cap(e.buf) > maxSize {
return
}
eventPool.Put(e)
}
putEvent 방법 은 e.buf 의 크기 가 max Size 를 초과 하 는 지 판단 하고 초과 하면 바로 돌아 갑 니 다.그렇지 않 으 면 eventPool.Put(e)를 실행 하여 eventPool 에 이 벤트 를 반환 합 니 다.
Info
github.com/rs/[email protected]/log.go
// Info starts a new message with info level.
//
// You must call Msg on the returned event in order to send the event.
func (l *Logger) Info() *Event {
return l.newEvent(InfoLevel, nil)
}
Info 방법 으로 실 행 된 l.newEvent(InfoLevel,nil)
newEvent
github.com/rs/[email protected]/log.go
func (l *Logger) newEvent(level Level, done func(string)) *Event {
enabled := l.should(level)
if !enabled {
return nil
}
e := newEvent(l.w, level)
e.done = done
e.ch = l.hooks
if level != NoLevel {
e.Str(LevelFieldName, LevelFieldMarshalFunc(level))
}
if l.context != nil && len(l.context) > 1 {
e.buf = enc.AppendObjectData(e.buf, l.context)
}
return e
}
func newEvent(w LevelWriter, level Level) *Event {
e := eventPool.Get().(*Event)
e.buf = e.buf[:0]
e.ch = nil
e.buf = enc.AppendBeginMarker(e.buf)
e.w = w
e.level = level
e.stack = false
return e
}
newEvent 방법 은 이벤트 Pool 에서 이 벤트 를 가 져 온 다음 done,hooks 등 속성 을 설정 합 니 다.
작은 매듭
zerolog 의 Send 방법 은 Msg(")에 해당 합 니 다.newEvent 방법 은 이벤트 Pool 에서 이 벤트 를 가 져 온 다음 done,hooks 등 속성 을 설정 합 니 다.write 는 level 이 Disabled 가 아 닐 때 endMarker 및 lineBreaker 를 추가 합 니 다.e.w 가 nil 이 아 닐 때 e.w.Write Level(e.level,e.buf)을 실행 하여 출력 합 니 다.이후 putEvent 반환 이벤트 실행;
doc
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
set containerThere is no built-in set container in Go How to implement Set struct{} => type struct{}{} => 0bytes How to create set :=...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.