首页 > 其他分享 >go-zero 微服务框架如何将日志输出到文件

go-zero 微服务框架如何将日志输出到文件

时间:2024-07-30 12:40:53浏览次数:16  
标签:represents default json server zero go 日志

在 go-zero 中,默认日志是输出到 控制台 的,项目运行起来后,往往都是输出到日志,今天看看 go-zero 框架的 API 功能的日志配置。

目前网上关于 go-zero 的配置相对少,找了一圈,没找到更多的资料或者案例,而且官方给的 doc 又是一笔带过,不多说,下面看看吧。

我们直接给出对应的配置:userapi.yaml

Name: userapi-api
Host: 0.0.0.0
Port: 8888

Auth:
  AccessSecret: 84a8a776-e447-4870-83ea-a17e8d28c76d
  AccessExpire: 3600

# 需要以 Log 作为 section
Log:
  Mode: file
  Level: debug
  Path: ./logs
  Rotation: daily

然后运行项目即可看到在项目中出现对应的不同 log:

image.png

为什么需要这样配置呢,追代码吧。

先看看项目启动的代码部分:
userapi.go

package main

import (
	"flag"
	"fmt"
	"userapiv1/internal/config"
	"userapiv1/internal/handler"
	"userapiv1/internal/svc"

	"github.com/zeromicro/go-zero/core/conf"
	"github.com/zeromicro/go-zero/rest"
)

var configFile = flag.String("f", "etc/userapi-api.yaml", "the config file")

func main() {
	flag.Parse()

	var c config.Config
	conf.MustLoad(*configFile, &c)

	server := rest.MustNewServer(c.RestConf)
	defer server.Stop()

	ctx := svc.NewServiceContext(c)
	handler.RegisterHandlers(server, ctx)

	// go-zero version >= v1.7.0
	//logx.AddWriter(logx.NewWriter(os.Stdout))  // 添加控制台输出

	fmt.Printf("Starting server at %s:%d...\n", c.Host, c.Port)
	server.Start()
}

go-zero/rest/server.go

func MustNewServer(c RestConf, opts ...RunOption) *Server {
	server, err := NewServer(c, opts...) // here
	if err != nil {
		log.Fatal(err)
	}

	return server
}

// NewServer returns a server with given config of c and options defined in opts.
// Be aware that later RunOption might overwrite previous one that write the same option.
func NewServer(c RestConf, opts ...RunOption) (*Server, error) {
	if err := c.SetUp(); err != nil { // here
		return nil, err
	}

	server := &Server{
		ngin:   newEngine(c),
		router: router.NewRouter(),
	}

	opts = append([]RunOption{WithNotFoundHandler(nil)}, opts...)
	for _, opt := range opts {
		opt(server)
	}

	return server, nil
}

go-zero/core/service/serviceconf.go

func (sc ServiceConf) SetUp() error {
	if len(sc.Log.ServiceName) == 0 {
		sc.Log.ServiceName = sc.Name
	}
	if err := logx.SetUp(sc.Log); err != nil { // here
		return err
	}

	sc.initMode()
	prometheus.StartAgent(sc.Prometheus)

	if len(sc.Telemetry.Name) == 0 {
		sc.Telemetry.Name = sc.Name
	}
	trace.StartAgent(sc.Telemetry)
	proc.AddShutdownListener(func() {
		trace.StopAgent()
	})

	if len(sc.MetricsUrl) > 0 {
		stat.SetReportWriter(stat.NewRemoteWriter(sc.MetricsUrl))
	}
	devserver.StartAgent(sc.DevServer)

	return nil
}

可以看到这里完成日志的配置,接下来看看具体的结构体:
同文件下:

// A ServiceConf is a service config.
type ServiceConf struct {
	Name       string
	Log        logx.LogConf
	Mode       string `json:",default=pro,options=dev|test|rt|pre|pro"`
	MetricsUrl string `json:",optional"`
	// Deprecated: please use DevServer
	Prometheus prometheus.Config `json:",optional"`
	Telemetry  trace.Config      `json:",optional"`
	DevServer  devserver.Config  `json:",optional"`
}

go-zero/core/logx/config.go

// A LogConf is a logging config.
type LogConf struct {
	// ServiceName represents the service name.
	ServiceName string `json:",optional"`
	// Mode represents the logging mode, default is `console`.
	// console: log to console.
	// file: log to file.
	// volume: used in k8s, prepend the hostname to the log file name.
	Mode string `json:",default=console,options=[console,file,volume]"`
	// Encoding represents the encoding type, default is `json`.
	// json: json encoding.
	// plain: plain text encoding, typically used in development.
	Encoding string `json:",default=json,options=[json,plain]"`
	// TimeFormat represents the time format, default is `2006-01-02T15:04:05.000Z07:00`.
	TimeFormat string `json:",optional"`
	// Path represents the log file path, default is `logs`.
	Path string `json:",default=logs"`
	// Level represents the log level, default is `info`.
	Level string `json:",default=info,options=[debug,info,error,severe]"`
	// MaxContentLength represents the max content bytes, default is no limit.
	MaxContentLength uint32 `json:",optional"`
	// Compress represents whether to compress the log file, default is `false`.
	Compress bool `json:",optional"`
	// Stdout represents whether to log statistics, default is `true`.
	Stat bool `json:",default=true"`
	// KeepDays represents how many days the log files will be kept. Default to keep all files.
	// Only take effect when Mode is `file` or `volume`, both work when Rotation is `daily` or `size`.
	KeepDays int `json:",optional"`
	// StackCooldownMillis represents the cooldown time for stack logging, default is 100ms.
	StackCooldownMillis int `json:",default=100"`
	// MaxBackups represents how many backup log files will be kept. 0 means all files will be kept forever.
	// Only take effect when RotationRuleType is `size`.
	// Even thougth `MaxBackups` sets 0, log files will still be removed
	// if the `KeepDays` limitation is reached.
	MaxBackups int `json:",default=0"`
	// MaxSize represents how much space the writing log file takes up. 0 means no limit. The unit is `MB`.
	// Only take effect when RotationRuleType is `size`
	MaxSize int `json:",default=0"`
	// RotationRuleType represents the type of log rotation rule. Default is `daily`.
	// daily: daily rotation.
	// size: size limited rotation.
	Rotation string `json:",default=daily,options=[daily,size]"`
}

所以兜一圈,你就会发现在 yaml 配置文件中应该以 Log 打头的 section,具体的字段的话,参考 logx.LogConf 字段进行配置。

另外有一点需要说明的是,我用的 go-zero 版本是 v1.5.0,如果需要在 控制台 也输出日志的话,需要在项目启动位置加入以下代码:

func main() {
	flag.Parse()

	var c config.Config
	conf.MustLoad(*configFile, &c)

	server := rest.MustNewServer(c.RestConf)
	defer server.Stop()

	ctx := svc.NewServiceContext(c)
	handler.RegisterHandlers(server, ctx)

	// go-zero version >= v1.7.0
	//logx.AddWriter(logx.NewWriter(os.Stdout))  // 添加控制台输出

	fmt.Printf("Starting server at %s:%d...\n", c.Host, c.Port)
	server.Start()
}

有个坑,就是对应的 go-zero 需要版本升级。

以上就是 go-zero 的日志配置,码字不易,希望对大家有用。

标签:represents,default,json,server,zero,go,日志
From: https://www.cnblogs.com/davis12/p/18332111

相关文章

  • Django 1.9 教程 __str__ () 不起作用
    我正在尝试使用Win10操作系统和Python3.5的Django1.9教程,Django版本是1.9。我已成功在“问题”和“选择”中创建并存储值。之后,当我按照教程__str__()django教程2更改了polls/model.py时。我收到此错误:我的polls\models.py是:>>>frompolls.mod......
  • mongodb数据库范围分片数据分布不均匀
    【说明】当前使用mongodb分片,三个分片mongos>sh.status()---ShardingStatus---shardingversion:{"_id":1,"minCompatibleVersion":5,"currentVersion":6,"clusterId":ObjectId(&quo......
  • 基于Python Django的旅游景点数据分析与推荐系统
    基于PythonDjango的旅游景点数据分析与推荐系统。源码+数据库+文档(LW)。开发技术:Pythondjangomysql。项目内容:系统包括多个功能模块,涵盖了用户管理、旅游景点管理、管理员管理、系统管理等方面,以及一些其他辅助功能和信息展示模块。用户管理模块允许管理员管理系统中的用......
  • django基于Python的校园个人闲置物品换购平台
    django基于Python的校园个人闲置物品换购平台。源码+数据库+文档(lw+ppt)。开发技术:Pythondjangomysql。项目内容:系统主要包括主页、个人中心、用户管理、景点信息管理、系统管理等功能。    ......
  • Django&rest_framework - 方法 get_queryset 被调用两次,还有其他更好的解决方案吗?
    目前,我有一个使用django和rest_framework来运行一些基本API的项目。问题是,当我使用rest_framework和DjangoModelPermissions上的通用库创建视图时,我的方法get_queryset被调用两次My权限类classDefaultModelPermissions(DjangoModelPermissions):"""......
  • 在python日志输出的每一行前面添加变量缩进
    我正在将日志记录构建到一个Python应用程序中,我希望它是人类可读的。目前,调试日志记录了调用的每个函数以及参数和返回值。这意味着,实际上,嵌套函数调用的调试日志可能如下所示:2024-07-2916:52:26,641:DEBUG:MainController.initialize_componentscalledwithargs<control......
  • Modbus TCP/ip Logosoft Comfort V8
    我正在做一个学校项目,其中包括徽标和我的计算机之间的tcp/ip通信,但我无法使其工作。我并不是想创建一个服务器,我只是想将一个值从我的计算机发送到徽标的网络数字输入。标志ip:192.168.0.2网络输入ID:1TCP/IP端口:502网络输入地址:1Estoyhaciendounproyectoescolar,qu......
  • 【Go - mongodb - bson / schema】
    Bson是什么bson 是MongoDB使用的一种二进制编码格式,全称为BinaryJSON。它用于存储和传输JSON风格的文档数据。bson 提供了一种高效的方式来表示JSON数据,同时支持更多的数据类型,例如日期和二进制数据。在Go语言中,bson 是由MongoDB官方驱动包 go.mongodb.or......
  • android u开机流程详细分析(中) - zygote
    5、zygoteZygote进程是Android中所有Java进程的父进程。Zygote进程在Init进程启动过程中被以service服务的形式启动。从android5.0开始,android开始支持64位的编译,zygote本身也就有了32位和64位的区别,所以在这里用ro.zygote属性来控制启动不同版本的zygote进程。init.rc位于......
  • Golang试用阿里通义千问大语言模型
    一、控制台配置通义千问密匙官方操作指南地址控制台地址注意:一个密匙申请之后,官方给了一个月期限共计100万条Token的额度 二、代码阶段1、DashScopRequest结构体 typeEngineRolestringconst(EngineRoleUserEngineRole="user"EngineRoleSystem......