go-zero(十一) 日志

发布于:2024-11-28 ⋅ 阅读:(12) ⋅ 点赞:(0)

go zero 日志

日志可以帮助我们记录应用程序的运行时信息、错误和调试信息,是个非常实用的工具。

一、基本介绍

1.logc和logx

go zero的日志主要由两个组件组成logxlogc.

  • logx 是go zero提供的核心日志库,它负责实际的日志记录工作。该组件支持多种输出方式和不同的日志级别(如 debug、info、warn、error),并且可以将日志信息输出到控制台、文件或远程服务器。

logc本质上是对 logx组件的一个封装,logclogx多一个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