微服务框架 go-zero logx 日志组件剖析

这篇具有很好参考价值的文章主要介绍了微服务框架 go-zero logx 日志组件剖析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

addTenant api 和 rpc 的实现

上一篇我们说到咱们还剩下 addTenant 功能还未实现,不知道有没有兄弟感兴趣去实验一波的,本篇文章进行简要补充

根据上一篇文章分析,其实我们只需要执行如下几步即可:

  1. 编写 tenant.api,提供外部 addTenant 的 http 接口
  • 编写 tenant.api

提供一个 POST http 的接口 / api /tenant/addtenant

type (
        AddTenantReq {
                Name string `json:"name"`
                Addr string `json:"addr"`
        }
        AddTenantRsp {
                Id string `json:"id"`
        }
)
service tenant {
        @handler addTenant
        post /api/tenant/addtenant(AddTenantReq) returns (AddTenantRsp)
  • goctl 生成 api 代码
goctl api go -api tenant.api  -dir .
  1. 修改 api 的配置和逻辑层,让 api 层去调用之前写好的 rpc 接口 即可

对于配置可以模仿上一篇文章 order.api 的配置进行修改,另外只需要调整 addTenant 的 logic 层即可

func (l *AddTenantLogic) AddTenant(req *types.AddTenantReq) (*types.AddTenantRsp, error) {
   // todo: add your logic here and delete this line
   rsp,err :=l.svcCtx.TenantRpc.AddTenant(l.ctx, &tenant.AddTenantReq{
      Name: req.Name,
      Addr: req.Addr,
   })
   if err !=nil{
      return nil,err
   }
   return &types.AddTenantRsp{Id: rsp.Id},nil
}

具体的代码案例可以访问地址:https://github.com/qingconglaixueit/my_test_Demo

下面我们来看是 go-zero 中 日志组件 logx 的剖析

logx 日志组件剖析

对于 logx 日志组件,分别从如下几个方面来聊一聊我的理解,如果描述有不当的地方,还请多加评论多加交流

  • Go-zero 中 logx 是如何使用的?
  • Logx 基本的数据结构
  • Logx 的默认接口实现
  • Logx 日志存储位置,以及自定义存储日志位置的实现
  • Logx 实现自定义接口的方式

Go-zero 中 logx 是如何使用的?

我们以之前的 demo ,关于 tenant 的 rpc 部分作为例子,追踪一下代码,是如何走到日志部分的逻辑的

可以看到在 tenant.go 的文件中,做的是服务的启动

微服务框架 go-zero logx 日志组件剖析,微服务,golang,架构

微服务框架 go-zero logx 日志组件剖析,微服务,golang,架构

zrpc.MustNewServer 实际上是调用 go-zero 的 zrpc 包 的 NewServer 函数,传入的参数是

  • c RpcServerConf , 我们 rpc 服务的配置,就是咱们项目中的 etc/tenant.yaml

微服务框架 go-zero logx 日志组件剖析,微服务,golang,架构

今天不聊关于 RpcServerConf 的结构,咱们重点说说 logx

  • register internal.RegisterFn 注册服务的回调函数

NewServer 函数做了如下几件事情:

  • RpcServerConf 配置数据的有效性检查
  • 初始化 metrics 的 options
  • 设置服务名,注册 etcd 服务,服务名就是上述配置文件中的 Name 字段
  • c.SetUp() 启动整个服务

对于 logx 日志组件的启动就是在 c.SetUp() 中完成

微服务框架 go-zero logx 日志组件剖析,微服务,golang,架构

Logx 基本的数据结构

继续看到 logx.SetUp() 中的具体实现 , 函数需要传入的数据结构是这样的 LogConf

微服务框架 go-zero logx 日志组件剖析,微服务,golang,架构

type LogConf struct {
   ServiceName         string `json:",optional"`
   Mode                string `json:",default=console,options=[console,file,volume]"`
   Encoding            string `json:",default=json,options=[json,plain]"`
   TimeFormat          string `json:",optional"`
   Path                string `json:",default=logs"`
   Level               string `json:",default=info,options=[info,error,severe]"`
   Compress            bool   `json:",optional"`
   KeepDays            int    `json:",optional"`
   StackCooldownMillis int    `json:",default=100"`
}
  • ServiceName:设置服务名称,可选。在 volume 模式下,该名称用于生成日志文件。在 rest/zrpc 服务中,名称将被自动设置为 restzrpc 的名称。
  • Mode:输出日志的模式,默认是 console

    • console 模式将日志写到 stdout/stderr
    • file 模式将日志写到 Path 指定目录的文件中
    • volume 模式在 docker 中使用,将日志写入挂载的卷中
  • Encoding: 指示如何对日志进行编码,默认是 json

    • json模式以 json 格式写日志
    • plain模式用纯文本写日志,并带有终端颜色显示
  • TimeFormat:自定义时间格式,可选。默认是 2006-01-02T15:04:05.000Z07:00
  • Path:设置日志路径,默认为 logs
  • Level: 用于过滤日志的日志级别。默认为 info

    • info,所有日志都被写入
    • error, info 的日志被丢弃
    • severe, infoerror 日志被丢弃,只有 severe 日志被写入
  • Compress: 是否压缩日志文件,只在 file 模式下工作
  • KeepDays:日志文件被保留多少天,在给定的天数之后,过期的文件将被自动删除。对 console 模式没有影响
  • StackCooldownMillis:多少毫秒后再次写入堆栈跟踪。用来避免堆栈跟踪日志过多

另外对于 SetUp 函数做了如下几件事:

微服务框架 go-zero logx 日志组件剖析,微服务,golang,架构

  • 设定日志等级
  • 初始化时间格式
  • 根据编码方式初始化存储日志编码类型
  • 根据设定的模式来初始化 Writer 句柄

Logx 的默认接口实现

对于 logx 打印日志的具体接口定义在:logx 包的 logger.go 文件中

微服务框架 go-zero logx 日志组件剖析,微服务,golang,架构

对于上述接口,根据需要传递的参数我们可以分为如下几类:

  • Error, Info, Slow: 将任何类型的信息写进日志,使用 fmt.Sprint(...) 来转换为 string
  • Errorf, Infof, Slowf: 将指定格式的信息写入日志
  • Errorv, Infov, Slowv: 将任何类型的信息写入日志,用 json marshal 编码
  • Errorw, Infow, Sloww: 写日志,并带上给定的 key:value 字段
  • WithContext:将给定的 ctx 注入日志信息,例如用于记录 trace-idspan-id
  • WithDuration: 将指定的时间写入日志信息中,字段名为 duration

例如接口名后缀带有 w 的,是需要咱们传入 key:value 的,例如传入的结构是这样的:

微服务框架 go-zero logx 日志组件剖析,微服务,golang,架构

实际上我们可以看到在 logx 源码中,其实有很多文件都已经根据自己的使用情况去实现了上述 Logger 接口

微服务框架 go-zero logx 日志组件剖析,微服务,golang,架构

举一个 traceLogger 的例子

实际上我们可以直接看到,我们之前实现的 GetTenant rpc 方法

微服务框架 go-zero logx 日志组件剖析,微服务,golang,架构

微服务框架 go-zero logx 日志组件剖析,微服务,golang,架构

我们可以看到当调用了NewGetTenantLogic 方法之后,实际上是会调用 logx.WithContext(ctx) 初始化一个 traceLogger 的句柄

traceLogger 实现了上述 Logger 接口, 因此,当我们需要在 rpc 中打印日志的时候,我们可以这样来使用

微服务框架 go-zero logx 日志组件剖析,微服务,golang,架构

这个时候,实际上是调用的 traceLogger 对应的实现代码

微服务框架 go-zero logx 日志组件剖析,微服务,golang,架构

我们可以看到,打印出来的日志,是我们所期望的信息

此处的字段对应含义是这样的:

微服务框架 go-zero logx 日志组件剖析,微服务,golang,架构

  • Timestamp

时间戳

  • Level

日志等级

  • Duration

时间间隔

  • Caller

日志调用者

  • Content

具体的日志信息

仔细查看上述日志,我们可以发现还有 trace 和 span 字段也打印出来了,但是 logEntry 为什么没有定义呢

咱们稍微追一下代码,不难看出,是 traceLogger 内部的 info 函数进行日志信息的拼接

微服务框架 go-zero logx 日志组件剖析,微服务,golang,架构

微服务框架 go-zero logx 日志组件剖析,微服务,golang,架构

Logx 自定义存储日志位置 和 实现自定义接口的方式

Logx 自定义存储日志位置 和 实现自定义接口的方式其实我在这里就不需要过多的解释了,简单说明一下实现手段就可以了,有必要的话咱们可以查看 go-zero 官方文档 https://go-zero.dev/cn/docs/component/logx/

自定义存储日志位置

对于咱们需要修改日志的输出位置,实际上我们可以仔细思考一下,对于日志的数据,go-zero 还是使用的 golang io 包中的 Writer 接口

咱们只需要定义对象,去实现 Writer 接口 中的 Write(p []byte) (n int, err error) 方法就可以了

微服务框架 go-zero logx 日志组件剖析,微服务,golang,架构

官网也给了我们例子,例如咱们实现输出的日志往 kafka 里面吐,我们就可以这样

微服务框架 go-zero logx 日志组件剖析,微服务,golang,架构

实现自定义接口

实现自定义接口,咱们其实刚才看 traceLogger 的实现方式,我们就能领悟到, traceLogger 去实现 Logger 接口中的方法,并且加入自己自定义的逻辑,例如加上了 trace 和 span

那么对于我们自定义接口,其实也是非常容易的,照葫芦画瓢即可了

\

感谢阅读,欢迎交流,点个赞,关注一波 再走吧

欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是阿兵云原生,欢迎点赞关注收藏,下次见~
可以进入地址进行体验和学习:https://xxetb.xet.tech/s/3lucCI文章来源地址https://www.toymoban.com/news/detail-674678.html

到了这里,关于微服务框架 go-zero logx 日志组件剖析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • go-zero学习 第三章 微服务

    1.1 API服务模块 goctl 使用 api 文件生成 api服务 命令: 1.2 RPC服务模块 goctl 使用 protoc 文件生成 rpc服务 命令: 注意: --go_out 、 --go-grpc_out 、 --zrpc_out 三者配置的路径需要完全一致,否则会报下列错误。 基础代码:已生成基本的API服务、RPC服务。 这里以API服务调用RPC服务的登

    2024年02月16日
    浏览(60)
  • go-zero的rpc服务案例解析

    go-zero的远程调用服务是基于gRpc的gRPC教程与应用。 zero使用使用gRpc需要安装 protoc 插件,因为gRpc基于protoc插件使用protocol buffers文件生成rpc服务器和api的代码的。 gRPC 的代码生成还依赖 protoc-gen-go,protoc-gen-go-grpc 插件来配合生成 Go 语言的 gRPC 代码。 也可以使用go get命令安装

    2024年02月13日
    浏览(64)
  • 【go-zero】go-zero阿里云oss 前端上传文件到go-zero API服务 并在k8s pod中创建文件 并推送到阿里云oss 最佳实践

    问题:在本地通过上传文件,然后将文件推送到aliyun的oss中,是没问题的 但是部署到了k8s中,则出现了问题,一直报错没有创建的权限 思路:开始认为应该将该文件挂载到configmap中,然后通过这种方式修改了deployment和dockerfile。最终发现应该是go的创建文件路径方式搞错了,

    2024年02月13日
    浏览(38)
  • Go-Zero微服务快速入门和最佳实践(一)

    并发编程和分布式微服务 是我们Gopher升职加薪的关键。 毕竟Go基础很容易搞定,不管你是否有编程经验,都可以比较快速的入门Go语言进行简单项目的开发。 虽说好上手,但是想和别人拉开差距,提高自己的竞争力, 搞懂分布式微服务和并发编程还是灰常重要的,这也是我

    2024年04月28日
    浏览(32)
  • go-zero微服务实战——etcd服务注册与发现

    浅谈etcd服务注册与发现 etcd官网 etcd中文文档 apt安装etcd,启动命令十分简单 etcd 。 etcd分为v2版本和v3版本,命令有所不一样,使用命令 etcdctl h 查看 如上图所示并没有出现API的版本,此时是使用默认的v2版本,但是v2版本很多命令使用不了,因此切换为v3版本,命令如下: e

    2024年02月12日
    浏览(29)
  • 微服务架构|go-zero 的自适应熔断器

    原文链接: go-zero 的自适应熔断器 上篇文章我们介绍了微服务的限流,详细分析了计数器限流和令牌桶限流算法,这篇文章来说说熔断。 熔断和限流还不太一样,限流是控制请求速率,只要还能承受,那么都会处理,但熔断不是。 在一条调用链上,如果发现某个服务异常,

    2024年02月10日
    浏览(41)
  • go-zero/grpc的rpc服务间传递额外数据

    go-zero/grpc的rpc服务间传递额外数据 2024/02/18 客户端: 初始化 md 也可如下方式: 追加新的如下: 也可使用 md 的 Set 和 Append 方法追加: 服务端: 注意 key 都会被转为小写,即使客户端为大写: 而且 key 只能由 数字、字母和三个特殊字符“-_.”组成,大写字母会自动被转为小写

    2024年02月19日
    浏览(49)
  • 基于go-zero的api服务刨析并对比与gin的区别

    官网go-zero go-zero是一个集成了各种工程实践的微服务框架,集多种功能于一体,如服务主要的API服务,RPC服务等。除了构建微服务工程外,zero也是一款性能优良的web框架,也可以构建单体web应用。 更多移步www.w3cschool.cn/go-zero。 go的web框架是很多的,例如github较为流行的有:

    2024年02月13日
    浏览(46)
  • GoZero微服务个人探究之路(二)Go-Zero官方api demo示例探究

    api demo 代码生成 | go-zero Documentation 编辑 demo-api.yaml 编辑 服务名称:demo-api HOST地址:0.0.0.0监听所有可用网络接口 Port地址:服务运行在8888端口 config/config.go 编辑 存储config信息,这里rest.RestConf是RESTful API的结构体,此外还可以添加数据库,缓存配置信息 handler/demohandler.go 编辑

    2024年01月18日
    浏览(38)
  • GoZero微服务个人探索之路(三)Go-Zero官方rpc demo示例探究

    两个文件均为protoc-gen-go-grpc自动生成 构成一个完整的 gRPC 服务的定义和实现 demo.go goctl生成的客户端代码 Request 和 Response 别名: 定义了 Request 和 Response 两个别名,实际上是从 demo 包中导入的对应的消息类型。 Demo 接口: 定义了一个 Demo 接口,其中包含了调用 gRPC 服务中 P

    2024年01月18日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包