log15是一个强大的结构化的golang日志包,支持日志颜色按等级输出,支持输出到终端、文件、流、系统日志和网络等。
import log "github.com/inconshreveable/log15"
log15 默认有5个日志等级,分别为Debug
, Info
,Warn
,Error
,Crit
。每个函数都接受第一个字符串作为消息,后面加任意数量的键值对。如下所示:
package main
import (
"github.com/spf13/viper"
"os"
"path/filepath"
log "github.com/inconshreveable/log15"
)
func main() {
viper.SetConfigName("configdemo")
gopath := os.Getenv("GOPATH")
for _, p := range filepath.SplitList(gopath) {
confpath := filepath.Join(p, "conf")
viper.AddConfigPath(confpath)
}
err := viper.ReadInConfig()
if err != nil {
log.Error("Read config file error!", "err", err.Error())
return
}
log.Info("Config node:", "node", viper.GetString("node"))
log.Warn("Config database:", "database", viper.GetString("database"))
log.Crit("Config index:", "index", viper.GetString("index"))
log.Info("Configs:", "node", viper.GetString("node"), "database", viper.GetString("database"), "index", viper.GetString("index"))
}
输出如下:
INFO[04-01|21:44:34] Config node: node=node1
WARN[04-01|21:44:34] Config database: database="db_user:db_password@tcp(db_host:db_port)/database?timeout=2s"
CRIT[04-01|21:44:34] Config index: index=1
INFO[04-01|21:44:34] Configs: node=node1 database="db_user:db_password@tcp(db_host:db_port)/database?timeout=2s" index=1
我们可以使用log.New()
定义一个日志上下文,使用该日志对象打出的日志都会携带该上下文:
package main
import (
"github.com/spf13/viper"
"os"
"path/filepath"
log "github.com/inconshreveable/log15"
)
func main() {
viper.SetConfigName("configdemo")
gopath := os.Getenv("GOPATH")
for _, p := range filepath.SplitList(gopath) {
confpath := filepath.Join(p, "conf")
viper.AddConfigPath(confpath)
}
err := viper.ReadInConfig()
if err != nil {
log.Error("Read config file error!", "err", err.Error())
return
}
// contexts mode
ctxLog := log.New("contexts", "log contexts")
ctxLog.Info("Config node:", "node", viper.GetString("node"))
ctxLog.Warn("Config database:", "database", viper.GetString("database"))
ctxLog.Crit("Config index:", "index", viper.GetString("index"))
}
输出如下:
INFO[04-01|21:44:34] Config node: contexts="log contexts" node=node1
WARN[04-01|21:44:34] Config database: contexts="log contexts" database="db_user:db_password@tcp(db_host:db_port)/database?timeout=2s"
CRIT[04-01|21:44:34] Config index: contexts="log contexts" index=1
log15支持特殊格式的日志输出,如指定输出格式为json形式,如下程序所示:
package main
import (
"github.com/spf13/viper"
"os"
"path/filepath"
log "github.com/inconshreveable/log15"
)
func main() {
viper.SetConfigName("configdemo")
gopath := os.Getenv("GOPATH")
for _, p := range filepath.SplitList(gopath) {
confpath := filepath.Join(p, "conf")
viper.AddConfigPath(confpath)
}
err := viper.ReadInConfig()
if err != nil {
log.Error("Read config file error!", "err", err.Error())
return
}
// specify output
specifyLog := log.New()
specifyLog.SetHandler(log.StreamHandler(os.Stdout, log.JsonFormat()))
specifyLog.Info("Config node:", "node", viper.GetString("node"))
specifyLog.Warn("Config database:", "database", viper.GetString("database"))
specifyLog.Crit("Config index:", "index", viper.GetString("index"))
}
输出如下:
{"lvl":"info","msg":"Config node:","node":"node1","t":"2018-04-01T21:44:34.197881804+08:00"}
{"database":"db_user:db_password@tcp(db_host:db_port)/database?timeout=2s","lvl":"warn","msg":"Config database:","t":"2018-04-01T21:44:34.198145674+08:00"}
{"index":"1","lvl":"crit","msg":"Config index:","t":"2018-04-01T21:44:34.198161022+08:00"}
https://github.com/qizheng09/confdemo