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.Config
conf.MustLoad(*configFile, &c)
// 初始化日志等级为err
logx.SetLevel(logx.ErrorLevel)
// 其他初始化代码...
}
2. 日志示例
在业务逻辑中,可以使用不同级别的日志记录方法来记录信息。以下是一个简单的示例:
package handler
import (
"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