glog
是通用的高性能日志管理模块,实现了强大易用的日志管理功能,是gf
开发框架的核心模块之一。
重要的几点说明:
glog
采用了无锁设计,性能高效;glog
支持文件输出、日志级别、日志分类、调试管理、调用跟踪、链式操作等等丰富特性;- 可以使用
glog.New
方法创建glog.Logger
对象用于自定义日志打印,也可以并推荐使用glog
默认提供的包方法来打印日志; - 当使用包方法修改模块配置时,注意任何的
glog.Set*
设置方法都将会全局生效; - 日志内容默认时间格式为
时间 [级别] 内容 换行
,其中时间
精确到毫秒级别,级别
为可选输出,内容
为调用端的参数输入,换行
为可选输出(部分方法自动为日志内容添加换行符号),日志内容示例:2018-10-10 12:00:01.568 [ERRO] 产生错误
; Print*/Debug*/Info*
方法输出日志内容到标准输出(stdout
),为防止日志的错乱,Notice*/Warning*/Error*/Critical*/Panic*/Fatal*
方法也是将日志内容输出到标准输出(stdout
);- 其中
Panic*
方法在输出日志信息后会引发panic
错误方法,Fatal*
方法在输出日志信息之后会停止进程运行,并返回进程状态码值为1
(正常程序退出状态码为0
);
从GF v1.10
版本开始,日志组件支持单例模式,使用g.Log(单例名称)
获取不同的单例日志管理对象。提供单例对象的目的在于针对不同业务场景可以使用不同配置的日志管理对象。
日志级别用于管理日志的输出,我们可以通过设定特定的日志级别来关闭/开启特定的日志内容。通过SetLevel
方法可以设置日志级别,glog
支持以下几种日志级别常量设定:
LEVEL_ALL
LEVEL_DEBU
LEVEL_INFO
LEVEL_NOTI
LEVEL_WARN
LEVEL_ERRO
LEVEL_CRIT
我们可以通过位操作
组合使用这几种级别,例如其中LEVEL_ALL
等价于LEVEL_DEBU | LEVEL_INFO | LEVEL_NOTI | LEVEL_WARN | LEVEL_ERRO | LEVEL_CRIT
。例如我们可以通过LEVEL_ALL & ^LEVEL_DEBU & ^LEVEL_INFO & ^LEVEL_NOTI
来过滤掉LEVEL_DEBU/LEVEL_INFO/LEVEL_NOTI
日志内容。
日志组件支持配置文件,当使用g.Log(单例名称)
获取Logger
单例对象时,将会自动通过默认的配置管理对象获取对应的Logger
配置。默认情况下会读取logger.单例名称
配置项,当该配置项不存在时,将会读取logger
配置项。
logger:
path: logs # 日志目录
# all LEVEL_ALL = LEVEL_DEBU | LEVEL_INFO | LEVEL_NOTI | LEVEL_WARN | LEVEL_ERRO | LEVEL_CRIT
# dev LEVEL_DEV = LEVEL_ALL
# pro LEVEL_PROD = LEVEL_WARN | LEVEL_ERRO | LEVEL_CRIT
level: all
stdout: true # 是否打印到控制台
logger1:
path: logger1
level: dev
stdout: true
logger2:
path: logger2
level: prod
stdout: false
D:.
│ go.mod
│ go.sum
│ main.go
│
└─config
config.yaml
package main
import (
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gctx"
"github.com/gogf/gf/v2/os/glog"
)
func main() {
ctx := gctx.New()
// 对应默认配置项 logger,默认default
g.Log().Debug(ctx, "[default]Debug")
g.Log().Info(ctx, "[default]info")
g.Log().Warning(ctx, "[default]Warning")
g.Log().Error(ctx, "[default]Error")
// 对应 logger.logger1 配置项
g.Log("logger1").Debug(ctx, "[logger1]Debug")
g.Log("logger1").Info(ctx, "[logger1]info")
g.Log("logger1").Warning(ctx, "[logger1]Warning")
g.Log("logger1").Error(ctx, "[logger1]Error")
// 对应 logger.logger2 配置项
g.Log("logger2").Debug(ctx, "[logger2]Debug")
g.Log("logger2").Info(ctx, "[logger2]info")
g.Log("logger2").Warning(ctx, "[logger2]Warning")
g.Log("logger2").Error(ctx, "[logger2]Error")
// 日志级别设置,过滤掉Info日志信息
l := glog.New()
l.Info(ctx, "info1")
l.SetLevel(glog.LEVEL_ALL ^ glog.LEVEL_INFO)
l.Info(ctx, "info2")
// 支持哪些级别
// LEVEL_DEBU | LEVEL_INFO | LEVEL_NOTI | LEVEL_WARN | LEVEL_ERRO | LEVEL_CRIT
// 异常
g.Log().Panic(ctx, "this is panic!")
g.Log().Info(ctx, "............")
}
logger:
path: logs # 日志目录
# all LEVEL_ALL = LEVEL_DEBU | LEVEL_INFO | LEVEL_NOTI | LEVEL_WARN | LEVEL_ERRO | LEVEL_CRIT
# dev LEVEL_DEV = LEVEL_ALL
# pro LEVEL_PROD = LEVEL_WARN | LEVEL_ERRO | LEVEL_CRIT
level: all
stdout: true # 是否打印到控制台
logger1:
path: logger1
level: dev
stdout: true
logger2:
path: logger2
level: prod
stdout: false