go-zero(十一) 日志

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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容