Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >聊聊zerolog的Level

聊聊zerolog的Level

原创
作者头像
code4it
修改于 2021-01-04 03:05:31
修改于 2021-01-04 03:05:31
90200
代码可运行
举报
文章被收录于专栏:码匠的流水账码匠的流水账
运行总次数:0
代码可运行

本文主要研究一下zerolog的Level

Level

github.com/rs/zerolog@v1.20.0/log.go

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// Level defines log levels.
type Level int8

const (
    // DebugLevel defines debug log level.
    DebugLevel Level = iota
    // InfoLevel defines info log level.
    InfoLevel
    // WarnLevel defines warn log level.
    WarnLevel
    // ErrorLevel defines error log level.
    ErrorLevel
    // FatalLevel defines fatal log level.
    FatalLevel
    // PanicLevel defines panic log level.
    PanicLevel
    // NoLevel defines an absent log level.
    NoLevel
    // Disabled disables the logger.
    Disabled

    // TraceLevel defines trace log level.
    TraceLevel Level = -1
)

func (l Level) String() string {
    switch l {
    case TraceLevel:
        return "trace"
    case DebugLevel:
        return "debug"
    case InfoLevel:
        return "info"
    case WarnLevel:
        return "warn"
    case ErrorLevel:
        return "error"
    case FatalLevel:
        return "fatal"
    case PanicLevel:
        return "panic"
    case NoLevel:
        return ""
    }
    return ""
}

Level为int8类型,其中trace最小为-1,之后是debug、info、warn、error、fatal、panic、NoLevel及Disabled

log.Level

github.com/rs/zerolog@v1.20.0/log.go

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func Trace() *zerolog.Event {
    return Logger.Trace()
}

func Debug() *zerolog.Event {
    return Logger.Debug()
}

func Info() *zerolog.Event {
    return Logger.Info()
}

func Warn() *zerolog.Event {
    return Logger.Warn()
}

func Error() *zerolog.Event {
    return Logger.Error()
}

func Fatal() *zerolog.Event {
    return Logger.Fatal()
}

func Panic() *zerolog.Event {
    return Logger.Panic()
}

log.go提供了Trace、Debug、Info、Warn、Error、Fatal、Panic方法来创建*zerolog.Event

logger.newEvent

github.com/rs/zerolog@v1.20.0/log.go

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func (l *Logger) Trace() *Event {
    return l.newEvent(TraceLevel, nil)
}

func (l *Logger) Debug() *Event {
    return l.newEvent(DebugLevel, nil)
}

func (l *Logger) Warn() *Event {
    return l.newEvent(WarnLevel, nil)
}

func (l *Logger) Error() *Event {
    return l.newEvent(ErrorLevel, nil)
}

func (l *Logger) Fatal() *Event {
    return l.newEvent(FatalLevel, func(msg string) { os.Exit(1) })
}

func (l *Logger) Panic() *Event {
    return l.newEvent(PanicLevel, func(msg string) { panic(msg) })
}

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
}

newEvent方法首先判断当前logger是否允许指定的level,不允许则直接返回nil;允许的话则通过event包的newEvent来新建event,设置done、hooks

event.newEvent

github.com/rs/zerolog@v1.20.0/event.go

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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方法从eventPool获取一个Event,然后重置一下其属性

WithLevel

github.com/rs/zerolog@v1.20.0/log/log.go

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func WithLevel(level zerolog.Level) *zerolog.Event {
    return Logger.WithLevel(level)
}

func (l *Logger) WithLevel(level Level) *Event {
    switch level {
    case TraceLevel:
        return l.Trace()
    case DebugLevel:
        return l.Debug()
    case InfoLevel:
        return l.Info()
    case WarnLevel:
        return l.Warn()
    case ErrorLevel:
        return l.Error()
    case FatalLevel:
        return l.newEvent(FatalLevel, nil)
    case PanicLevel:
        return l.newEvent(PanicLevel, nil)
    case NoLevel:
        return l.Log()
    case Disabled:
        return nil
    default:
        panic("zerolog: WithLevel(): invalid level: " + strconv.Itoa(int(level)))
    }
}

WithLevel可以动态传入Level,然后返回指定level的event

SetGlobalLevel

github.com/rs/zerolog@v1.20.0/ctx.go

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func init() {
    SetGlobalLevel(TraceLevel)
    l := Nop()
    disabledLogger = &l
}

默认是TraceLevel

实例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func withLevelDemo() {
    log.WithLevel(zerolog.TraceLevel).Msg("trace level")
    log.WithLevel(zerolog.DebugLevel).Msg("debug level")
    log.WithLevel(zerolog.InfoLevel).Msg("info level")
}

输出

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{"level":"trace","time":"2021-01-03T20:59:42+08:00","message":"trace level"}
{"level":"debug","time":"2021-01-03T20:59:42+08:00","message":"debug level"}
{"level":"info","time":"2021-01-03T20:59:42+08:00","message":"info level"}

小结

Level为int8类型,其中trace最小为-1,之后是debug、info、warn、error、fatal、panic、NoLevel及Disabled;log.go提供了Trace、Debug、Info、Warn、Error、Fatal、Panic方法来创建*zerolog.Event;WithLevel可以动态传入Level,然后返回指定level的event。

doc

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
聊聊zerolog的Hook
zerolog提供了Hook接口,用于修改event;log.Hook方法用于注册hook;log.newEvent方法在创建event的时候会把自己的hooks拷贝给event;event的msg方法会遍历event的hooks,然后挨个执行Hook的Run方法。
code4it
2021/01/07
4980
聊聊zerolog的Hook
golang的zap的SugaredLogger
序 本文主要研究一下golang的zap的SugaredLogger using-apache-kafka-from-go-23-638.jpg SugaredLogger zap@v1.16.0/sugar.go type SugaredLogger struct { base *Logger } func (s *SugaredLogger) Named(name string) *SugaredLogger { return &SugaredLogger{base: s.base
code4it
2020/12/05
9570
golang的zap的SugaredLogger
聊聊zerolog的encoder
github.com/rs/zerolog@v1.20.0/internal/json/types.go
code4it
2021/01/04
6070
聊聊zerolog的encoder
聊聊golang的zap的level
Level为int8类型,其中DebugLevel值最小,FatalLevel值最大;LevelEnabler接口定义了Enabled方法,Level的Enabled方法判断lvl是否大于等于l;levelFilterCore定义了Core、LevelEnabler属性;其Check方法首先通过c.Enabled(ent.Level)判断entry的level是否大于等于core的level,如果满足条件才执行c.core.Check(ent, ce),否则直接返回。
code4it
2020/12/21
5740
聊聊golang的zap的level
手把手,带你从零封装Gin框架(三):日志初始化
本篇来讲一下怎么将日志服务集成到项目中,它也是框架中必不可少的,平时代码调试,线上 Bug 分析都离不开它。这里将使用 zap 作为日志库,一般来说,日志都是需要写入到文件保存的,这也是 zap 唯一缺少的部分,所以我将结合 lumberjack 来使用,实现日志切割归档的功能
用户10002156
2024/01/10
1.4K1
手把手,带你从零封装Gin框架(三):日志初始化
Go每日一库之86:zerolog
zerolog 的 API 旨在为开发者提供出色的体验和令人惊叹的性能。其独特的链式 API 允许通过避免内存分配和反射来写入 JSON ( 或 CBOR ) 日志。
luckpunk
2023/09/30
9490
Go每日一库之86:zerolog
聊聊zerolog的LevelWriter
LevelWriter接口内嵌了io.Writer接口,定义了WriteLevel方法;levelWriterAdapter内嵌了io.Writer属性,实现了LevelWriter的WriteLevel方法,该方法内部通过io.Writer属性的Write方法来输出;SyncWriter方法通过levelWriterAdapter来适配io.Writer;MultiLevelWriter方法通过levelWriterAdapter来适配io.Writer。
code4it
2021/01/02
3170
聊聊zerolog的LevelWriter
Go每日一库之87:zap
大多数日志库提供的方式是基于反射的序列化和字符串格式化,这种方式代价高昂,而 Zap 采取不同的方法。
luckpunk
2023/09/30
9630
Go每日一库之87:zap
聊聊zerolog的LevelWriter
LevelWriter接口内嵌了io.Writer接口,定义了WriteLevel方法;levelWriterAdapter内嵌了io.Writer属性,实现了LevelWriter的WriteLevel方法,该方法内部通过io.Writer属性的Write方法来输出;SyncWriter方法通过levelWriterAdapter来适配io.Writer;MultiLevelWriter方法通过levelWriterAdapter来适配io.Writer。
code4it
2021/01/12
5350
聊聊zerolog的send
zerolog的Send方法相当于Msg("");newEvent方法从eventPool获取Event,然后设置done、hooks等属性;write在level不为Disabled的时候会追加endMarker及lineBreaker;对于e.w不为nil时,执行e.w.WriteLevel(e.level, e.buf)进行输出;之后执行putEvent归还event;
code4it
2021/01/01
8490
聊聊zerolog的send
Golang 库 - 日志库 logrus
golang 标准库的日志框架非常简单,仅仅提供了print, panic 和 fatal三个函数。对于更精细的日志级别、日志文件分割以及日志分发等方面并没有提供支持. 所以催生了很多第三方的日志库,但是在golang的世界里,没有一个日志库像slf4j那样在Java中具有绝对统治地位.golang中,流行的日志框架包括logrus、zap、zerolog、seelog等.
twowinter
2020/04/17
3.8K0
聊聊golang的zap的global.go
global.go提供了ReplaceGlobals方法用于注册全局的单例的logger;提供了NewStdLog方法用于返回标准库的log.Logger,然后使用该logger的输出都会通过zap.Logger来输出;提供了RedirectStdLog方法用于改变全局的标准库的log的输出,将其通过zap.Logger来输出,该方法返回一个func来撤销这种重定向。
code4it
2020/12/13
7250
聊聊golang的zap的global.go
聊聊golang的zap的Core
Core接口内嵌了LevelEnabler,定义了With、Check、Write、Sync方法;它有nopCore及ioCore两种实现,ioCore内嵌了LevelEnabler,定义了Encoder、WriteSyncer(out)属性,其中encoder用来序列化entry为bytes,而WriteSyncer则用于写入bytes。
code4it
2020/12/08
1.1K0
聊聊golang的zap的Core
Golang logrus 快速上手
logrus 是一款功能强大的 Golang 日志库,具有非常灵活的配置选项。它支持多种日志级别、格式和输出方式,包括 JSON 格式的输出、syslog 输出等等。logrus 也可以通过 Hooks 实现日志的异步输出和处理。
恋喵大鲤鱼
2023/02/23
1.9K0
聊聊zerolog的Formatter
zerolog的ConsoleWriter定义了Formatter用于自定义输出格式,如果FormatTimestamp没有设置,则取TimeFormat创建Formatter。
code4it
2021/01/06
1.5K0
聊聊zerolog的Formatter
聊聊zerolog的diode.Writer
github.com/rs/zerolog@v1.20.0/diode/diode.go
code4it
2021/01/05
4570
聊聊zerolog的diode.Writer
Go 每日一库之 zerolog
每个编程语言都有很多日志库,因为记录日志在每个项目中都是必须的。前面我们介绍了标准日志库log、好用的logrus和上一篇文章中介绍的由 uber 开源的高性能日志库zap。zerolog相比zap更进了一步,它的 API 设计非常注重开发体验和性能。zerolog只专注于记录 JSON 格式的日志,号称 0 内存分配!
用户7731323
2020/09/08
1.8K0
从零实现ORM框架GeoORM-database/sql基础-01
本系列源码: https://gitee.com/DaHuYuXiXi/geo-orm
大忽悠爱学习
2022/09/27
5530
从零实现ORM框架GeoORM-database/sql基础-01
[golang]log日志 Logrus的使用
Logrus is a structured logger for Go (golang), completely API compatible with the standard library logger.
landv
2020/06/16
2.2K0
高性能 Go 日志库 zap 设计与实现
最近我也在学习如何在开发中让代码运行更加高效,然后在浏览各种优秀的日志设计的时候看到 uber 有一个叫 zap 的日志库引起了我的注意,它主要特性是对性能和内存分配都做到了极致的优化。
luozhiyun
2021/05/29
4.3K0
相关推荐
聊聊zerolog的Hook
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验