go zero 日志
日志可以帮助我们记录应用程序的运行时信息、错误和调试信息,是个非常实用的工具。
一、基本介绍
1.logc和logx
go zero的日志主要由两个组件组成logx
和logc
.
logx
是go zero提供的核心日志库,它负责实际的日志记录工作。该组件支持多种输出方式和不同的日志级别(如 debug、info、warn、error),并且可以将日志信息输出到控制台、文件或远程服务器。
logc
本质上是对 logx
组件的一个封装,logc
比logx
多一个ctx
参数,能够将日志信息与请求的上下文(即 ctx)进行关联。开发者可以更轻松地根据日志记录来追踪请求的处理过程,快速定位问题。
go zero日志的主要特点包括:
- 灵活性:支持多种日志输出方式,如控制台、文件和远程服务器等。
- 等级分类:支持不同级别的日志记录(如 debug、info、warn、error)。
- 结构化日志:能够生成结构化日志,便于后续查询和分析。
- 可自定义格式:可以根据自己的需求自定义日志格式。
2.日志配置结构说明
LogConf
定义日志系统所需的基本配置,具体说明看注释:
// LogConf 是日志配置.
type LogConf struct {// ServiceName 表示服务名称.ServiceName string `json:",optional"`// Mode 表示日志模式,默认是 `console`.// console: 输出到控制台.// file: 输出到文件.// volume: 在K8s中使用,向日志文件名添加主机名前缀.Mode string `json:",default=console,options=[console,file,volume]"`// Encoding 表示编码类型,默认是 `json`.// json: json 编码.// plain: 纯文本编码,通常在开发中使用.Encoding string `json:",default=json,options=[json,plain]"`// TimeFormat 表示时间格式,默认是 `2006-01-02T15:04:05.000Z07:00`.TimeFormat string `json:",optional"`// Path 表示日志文件路径,默认是 `logs`.Path string `json:",default=logs"`// Level 表示日志级别,默认是 `info`.// debug: 调试日志.// info: 信息日志.// error: 错误日志.// severe: 严重错误日志.Level string `json:",default=info,options=[debug,info,error,severe]"`// MaxContentLength 表示最大内容字节数,默认没有限制.MaxContentLength uint32 `json:",optional"`// Compress 表示是否压缩日志文件,默认是 `false`.Compress bool `json:",optional"`// Stat 表示是否记录统计信息,默认是 `true`.Stat bool `json:",default=true"`// KeepDays 表示日志文件将保留多少天,默认保留所有文件.// 仅在模式为 `file` 或 `volume` 时生效,当 Rotation 为 `daily` 或 `size` 时均可工作.KeepDays int `json:",optional"`// StackCooldownMillis 表示栈日志的冷却时间,默认是 100 毫秒.StackCooldownMillis int `json:",default=100"`// MaxBackups 表示保留多少个备份日志文件。0 表示所有文件将永久保留.// 仅在 RotationRuleType 为 `size` 时生效.// 即使 `MaxBackups` 设置为 0,当达到 `KeepDays` 限制时,日志文件仍将被移除.MaxBackups int `json:",default=0"`// MaxSize 表示写入日志文件所占用的空间。0 表示没有限制。单位为 `MB`.// 仅在 RotationRuleType 为 `size` 时生效.MaxSize int `json:",default=0"`// Rotation 表示日志轮转规则的类型。默认是 `daily`.// daily: 按天轮转.// size: 按大小限制轮转.Rotation string `json:",default=daily,options=[daily,size]"`// FileTimeFormat 表示文件名的时间格式,默认是 `2006-01-02T15:04:05.000Z07:00`.FileTimeFormat string `json:",optional"`
}
日志等级
目前go zero支持的日志等级有4种:
- debug: 调试日志.
- info: 信息日志. 默认为info
- error: 错误日志.
- severe: 严重错误日志.
日志模式
目前日志打印模式主要分为3种,一种文件输出,一种控制台输出,还有一个是在K8S中使用的
- console: 输出到控制台.默认是
console
. - file: 输出到文件.
- volume: 在K8s中使用,向日志文件名添加主机名前缀.
二、日志的使用
1. 日志配置初始化
使用yaml文件初始化
我们可以在yaml
文件中配置日志,例如我们设置下日志输出等级:
Log:Level: "error"
使用代码初始化
也可以在 main.go
文件中,可以通过如下方式初始化日志配置:
func main() {flag.Parse()var c config.Configconf.MustLoad(*configFile, &c)// 初始化日志等级为errlogx.SetLevel(logx.ErrorLevel)// 其他初始化代码...
}
2. 日志示例
在业务逻辑中,可以使用不同级别的日志记录方法来记录信息。以下是一个简单的示例:
package handlerimport ("net/http""github.com/zeromicro/go zero/rest/httpx""github.com/zeromicro/go zero/core/logx"
)func SomeHandler(w http.ResponseWriter, r *http.Request) {logx.Info("Received a request for SomeHandler.")// 业务逻辑err := processRequest()if err != nil {logx.Error("Failed to process request: ", err) // 记录错误日志httpx.Error(w, err)return}logx.Infof("Request processed successfully.") // 记录信息日志httpx.Ok(w, "Success")
}
更多使用方法可以查看官方文档
https://go-zero.dev/docs/components/logx