go_zap.go如下

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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
/*
logPath 日志文件路径
logLevel 日志级别 debug/info/warn/error,debug输出:debug/info/warn/error日志。 info输出:info/warn/error日志。 warn输出:warn/error日志。 error输出:error日志。
maxSize 单个文件大小,MB
maxBackups 保存的文件个数
maxAge 保存的天数, 没有的话不删除
compress 压缩
jsonFormat 是否输出为json格式
shoowLine 显示代码行
logInConsole 是否同时输出到控制台
*/

package main

import (
"github.com/natefinch/lumberjack"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"os"
"time"
)

var logger *zap.Logger

func initLogger(logPath string, logLevel string, maxSize, maxBackups, maxAge int, compress, jsonFormat, showLine, logInConsole bool) {
// 设置日志级别
var level zapcore.Level
switch logLevel {
case "debug":
level = zap.DebugLevel
case "info":
level = zap.InfoLevel
case "warn":
level = zap.WarnLevel
case "error":
level = zap.ErrorLevel
default:
level = zap.InfoLevel
}

var (
syncer zapcore.WriteSyncer
// 自定义时间输出格式
customTimeEncoder = func(t time.Time, enc zapcore.PrimitiveArrayEncoder) {
enc.AppendString("[" + t.Format("2006-01-02 15:04:05.000") + "]")
}
// 自定义日志级别显示
customLevelEncoder = func(level zapcore.Level, enc zapcore.PrimitiveArrayEncoder) {
enc.AppendString("[" + level.CapitalString() + "]")
}
)

// 定义日志切割配置
hook := lumberjack.Logger{
Filename: logPath, // 日志文件的位置
MaxSize: maxSize, // 在进行切割之前,日志文件的最大大小(以MB为单位)
MaxBackups: maxBackups, // 保留旧文件的最大个数
Compress: compress, // 是否压缩 disabled by default
}
if maxAge > 0 {
hook.MaxAge = maxAge // days
}

// 判断是否控制台输出日志
if logInConsole {
syncer = zapcore.NewMultiWriteSyncer(zapcore.AddSync(os.Stdout), zapcore.AddSync(&hook))
} else {
syncer = zapcore.AddSync(&hook)
}

// 定义zap配置信息
encoderConfig := zapcore.EncoderConfig{
TimeKey: "time",
LevelKey: "level",
NameKey: "logger",
CallerKey: "line",
MessageKey: "msg",
StacktraceKey: "stacktrace",
LineEnding: zapcore.DefaultLineEnding,
EncodeTime: customTimeEncoder, // 自定义时间格式
EncodeLevel: customLevelEncoder, // 小写编码器
EncodeCaller: zapcore.ShortCallerEncoder, // 全路径编码器
EncodeDuration: zapcore.SecondsDurationEncoder,
EncodeName: zapcore.FullNameEncoder,
}

var encoder zapcore.Encoder
// 判断是否json格式输出
if jsonFormat {
encoder = zapcore.NewJSONEncoder(encoderConfig)
} else {
encoder = zapcore.NewConsoleEncoder(encoderConfig)
}

core := zapcore.NewCore(
encoder,
syncer,
level,
)

logger = zap.New(core)
// 判断是否显示代码行号
if showLine {
logger = logger.WithOptions(zap.AddCaller())
}
}

调用示例

1
2
3
4
5
6
7
func main() {
initLogger("./all.log", "debug", 50, 10, 0, false, false, true, true)
logger.Debug("debug 日志")
logger.Info("info 日志")
logger.Warn("warning 日志")
logger.Error("error 日志")
}

控制台输出结果

1
2
3
4
[2021-09-22 18:30:45.288]       [DEBUG] fengzhuang/main.go:110  debug 日志
[2021-09-22 18:30:45.289] [INFO] fengzhuang/main.go:111 info 日志
[2021-09-22 18:30:45.289] [WARN] fengzhuang/main.go:112 warning 日志
[2021-09-22 18:30:45.289] [ERROR] fengzhuang/main.go:113 error 日志

日志文件输出结果

1
2
3
4
5
$ cat all.log
[2021-09-22 18:31:56.031] [DEBUG] fengzhuang/main.go:110 debug 日志
[2021-09-22 18:31:56.032] [INFO] fengzhuang/main.go:111 info 日志
[2021-09-22 18:31:56.032] [WARN] fengzhuang/main.go:112 warning 日志
[2021-09-22 18:31:56.032] [ERROR] fengzhuang/main.go:113 error 日志

其他调用示例

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
func httpGet(url string) {
initLogger("./all.log", "debug", 50, 10, 0, false, false, true, true)
resp, _, err := gorequest.New().Get(url).End()

if err != nil {
logger.Error(
"error Fetching url...",
zap.String("url", url),
zap.Errors("error", err),
)
} else {
logger.Info(
"success curl url",
zap.String("statusCode", resp.Status),
zap.String("Host", resp.Request.Host),
zap.String("url=", url),
)
}
}

func main() {
// 成功时输出Info日志
httpGet("https://www.baidu.com")

// 失败时输出ERROR日志
httpGet("www.baidu.com")
}

输出

1
2
[2021-09-22 18:48:59.668]       [INFO]  fengzhuang-example/main.go:120  success curl url        {"statusCode": "200 OK", "Host": "www.baidu.com", "url=": "https://www.baidu.com"}
[2021-09-22 18:48:59.671] [ERROR] fengzhuang-example/main.go:114 error Fetching url... {"url": "www.baidu.com", "error": [{"error": "Get \"www.baidu.com\": unsupported protocol scheme \"\""}]}