自定义日志(推荐)
这里实现了控制台和文件日志
/utils/zlog/zlog.go
1 | package zlog |
调用
1 | //初始化 必须调用 用来确定源代码的根路径 |
和Gin结合
基本封装
当我们使用Gin框架的时候,我们可以简单的封装一下
1 | package zlog |
调用
1 | zlog.Debug(utils.ObjToJson(list)) |
打印行号
1 | package zlog |
调用
1 | zlog.Info("Hello World") |
打印日志
2024-02-26 21:53:15 INFO D:/Project/go/z-wiki/main.go:33(main.main) ↓
Hello World
这样我们点击日志就直接跳转到对应的代码位置了。
在文件输出日志
Gin框架的请求日志默认在控制台输出,但更多的时候,尤其上线运行时,我们希望将用户的请求日志保存到日志文件中,以便更好的分析与备份。
在Gin框架中,通过gin.DefaultWriter
变量可能控制日志的保存方式,gin.DefaultWriter
在Gin框架中的定义如下:
1 | var DefaultWriter io.Writer = os.Stdout |
从上面的定义我们可以看出,gin.DefaultWriter
的类型为io.Writer
,默认值为os.Stdout
,即控制台输出,
因此我们可以通过修改gin.DefaultWriter
值来将请求日志保存到日志文件或其他地方(比如数据库)。
1 | package main |
运行后上面的程序,会在程序所在目录创建access.log
文件,当我们发起Web请求后,请求的日志会保存到access.log
文件,而不会在控制台输出。
也可以让请求日志同行保存到文件和在控制台输出:
1 | file, _ := os.Create("access.log") |
zap(推荐)
需要go1.19版本及以上
安装
1 | go get go.uber.org/zap |
设置全局变量
如果您想在不先创建 Logger 实例的情况下写入日志,您可以在 init() 函数中使用 ReplaceGlobals() 方法:
1 | package main |
此方法将可通过 zap.L() 访问的全局记录器替换为功能性 Logger 实例,以便您只需将 zap 包导入文件即可直接使用它。
不同环境切换
您可以使用环境变量轻松地在开发和生产 Logger 之间切换:
1 | logger := zap.Must(zap.NewProduction()) |
在Gin中
1 | func init() { |
不同模式
示例
1 | logger := zap.NewExample(zap.AddCaller()) |
打印输出结果:
{“level”:”info”,”msg”:”Hello World”,”name”:”psvmc”}
{“level”:”info”,”ts”:1708956240.9281151,”caller”:”z-wiki/main.go:38”,”msg”:”Hello World”,”name”:”psvmc”}
2024-02-26T22:04:00.928+0800 INFO z-wiki/main.go:42 Hello World {“name”: “psvmc”}
log/slog
需要go1.21版本及以上
log/slog是Go 1.21中引入的一个新的结构化日志库,它与标准库的log包兼容,但提供了更多的功能和灵活性。
log/slog定义了一个类型,Logger,用于记录不同级别和格式的日志信息。每个Logger都关联一个Handler,用于处理日志记录。
log/slog还提供了一个默认的Logger,可以通过顶级函数(如Info和Error)来使用,它们会调用相应的Logger方法。
该默认Logger将日志信息写入标准错误,并在每条日志信息前添加日期和时间。
log/slog的日志记录由以下几个部分组成:
- 时间:日志记录发生的时间,可以是本地时间或UTC时间。
- 级别:日志记录的严重程度,可以是预定义的四个级别之一(Debug、Info、Warn、Error),也可以是自定义的整数值。
- 消息:日志记录的主要内容,通常是一个简短的描述性字符串。
- 属性:日志记录的额外信息,以键值对的形式表示,键是字符串,值可以是任意类型。
基本示例
例如,以下代码:
1 | package main |
会产生以下输出:
1 | 2024/02/26 18:58:17 INFO hello-world user="" |
其中,2024/02/26 18:58:17
是时间,INFO
是级别,hello-world
是消息,user=""
是属性。
log/slog还提供了一些有用的特性,如:
- 可以自定义日志级别、输出目标、格式器(JSON或文本)、时间戳等。
- 可以使用字段(Fields)来添加结构化的上下文信息,如键值对。
- 可以使用处理器(Handler)来处理不同级别或条件的日志信息,如过滤、分割、彩色等。
- 可以使用条目(Entry)来记录带有字段的日志信息,或者使用WithFields、WithTime、WithError等方法来创建带有字段的条目。
- 可以使用日志级别函数(如Info、Warn、Error等)来记录不同级别的日志信息,或者使用Log或Print等方法来记录默认级别的日志信息。
标准错误和标准输出
以下是一个使用log/slog的示例代码:
1 | package main |
该程序会在标准错误上输出文本格式的日志信息:
1 | time=2024-02-26T22:35:53.533+08:00 level=INFO msg=hello-world user="" |
然后在标准输出上输出JSON格式的日志信息:
1 | {"time":"2024-02-26T22:35:53.5512541+08:00","level":"INFO","msg":"hello-world","user":""} |
logrus
1 | go get github.com/sirupsen/logrus |
引用
1 | import "github.com/sirupsen/logrus" |
示例
1 | package main |
IDEA日志高亮
File
=> Settings
=> Plugins
搜索 Grep Console
安装即可,安装后会根据日志中日志级别显示不同颜色。