本文介绍在golang中的日志使用方式。
官方自带Log包
- demo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22package main
import "log"
func init() {
// 设置log前缀
log.SetPrefix("TRACE: ")
// 设置日志内容:日期、时间、文件
log.SetFlags(log.Ldate | log.Ltime |log.Llongfile)
}
func main() {
// 打印标准日志
log.Println("message")
// 使用格式化输出日志
log.Printf("the result is :%s", "log")
// 致命错误,直接退出程序
log.Fatal("fatal message")
}
自定义Logger
指定目录存储日志
1 | package main |
使用logrus
- 安装示例:
1
go get github.com/sirupsen/logrus
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38func main() {
// 实例化,实际项目中一般用全局变量来初始化一个日志管理器
logger := logrus.New()
// 设置日志内容为json格式
logger.SetFormatter(&logrus.JSONFormatter{
TimestampFormat: "2006-01-02 15:04:05", // 时间格式
DisableTimestamp: false, //是否禁用日期
DisableHTMLEscape: false, // 是否禁用html转义
DataKey: "" ,
FieldMap: logrus.FieldMap{
logrus.FieldKeyMsg : "content", // 修改"msg"字段名称为"content"
},
CallerPrettyfier: nil,
PrettyPrint: false, // 是否需要格式化
})
// 设置记录日志的最高等级,比如这里设置的info等级,那么只有比info低级的 Warn(), Error(), Fatal()以及自身Info()能够打印
logger.Level = logrus.InfoLevel
// 指定日志的输出为文件,默认是os.Stdout
f, err := os.OpenFile("logrus.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
if err != nil {
log.Fatal("Failed to open:", err.Error())
}
logger.Out = f
logger.Info("this is info level")
logger.Debug("this is debug level")
logger.Warning("this is waring level")
logger.Error("this is error level")
// 日志+致命错误,程序直接退出
//logger.Fatal("this is fatal level")
// 在日志内容里增加一个字段title,它的值为user
// 输出:{"content":"this is from user service log","level":"info","time":"2020-04-02 14:01:29","title":"user"}
logger.WithField("title","user").Info("this is from user service log")
}
uber的zap
号称超高性能的日志库
安装
1
go get -u go.uber.org/zap
demo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57func main() {
cfg := zap.Config{
// Level 最小启用的日志等级,可以通过cfg.Level.SetLevel()动态调整
Level: zap.NewAtomicLevelAt(zap.DebugLevel),
// Development 当开启时,使用DPanic(),会直接panic,调试时极其方便
Development: false,
// 格式设为json
Encoding: "json",
EncoderConfig: zapcore.EncoderConfig{
TimeKey: "time", //时间的key
LevelKey: "level", // 日志等级的key
NameKey: "logger",
CallerKey: "caller",
MessageKey: "msg",
StacktraceKey: "trace",
LineEnding: zapcore.DefaultLineEnding,
EncodeLevel: zapcore.LowercaseLevelEncoder,
EncodeDuration: zapcore.SecondsDurationEncoder,
EncodeCaller: zapcore.ShortCallerEncoder,
// 设定时间格式
EncodeTime: func(t time.Time, encoder zapcore.PrimitiveArrayEncoder) {
encoder.AppendString(fmt.Sprintf("%d%02d%02d_%02d%02d%02d", t.Year(), t.Month(), t.Day(), t.Hour(), t.Minute(), t.Second()))
},
},
// 日志输出目录
OutputPaths: []string{"/tmp/zap.log"},
// 将系统内的error记录到文件的地址
ErrorOutputPaths: []string{"/tmp/zap.log"},
// 加入一些初始的字段数据,比如项目名
InitialFields: map[string]interface{}{
"system_name": "user",
},
}
logger, err := cfg.Build()
if err != nil {
log.Fatal(err.Error())
}
defer logger.Sync()
logger.Info("info", zap.Field{
Key: "hello",
String: "world",
Type: zapcore.StringType,
})
logger.Error("error", zap.Field{
Key: "hello",
String: "world",
Type: zapcore.StringType,
})
logger.DPanic("panic", zap.Field{
Key: "hello",
String: "world",
Type: zapcore.StringType,
})
}
- 本文作者: Hongker
- 本文链接: https://hongker.github.io/2020/04/01/golang-log/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!