go基于grpc构建微服务框架-结构化日志输出

go基于grpc构建微服务框架-结构化日志输出

大家好,又见面了,我是你们的朋友全栈君。

1.结构化日志的意义

1.1 日志格式化

日志主要用于跟踪服务的运行信息,作为后端攻城狮,一般都会有一种想法,平时的时候希望日志越少越好,出问题的时候又总是抱怨,怎么才tmd这点日志,还在关键的地方没打印.

因此,日志很重要,将日志进行格式化也很重要,日志格式化主要是为了方便后续进行分析.如通过将错误码格式化到日志中,我们可以对收集后的日志分析接口的调用健康状态,将接口耗时格式化后上报,可以监控延时高的操作,并查询出关联日志进行分析.

所以只要是格式化输出,很容易有很多应用.

1.2 日志库应该有的特性

  • 高性能

这里主要是两方面,每次操作的耗时,以及每次操作分配的内存,作为日志库,两个指标都应该要极低.

  • 日志等级过滤

能通过调节日志等级打印不同级别的日志.

  • 采样率

能够设置采样率,防止服务请求增加时输出的日志量剧增,从而影响服务性能.

  • 自动切分文件

自动按一定大小切分文件,定期归档,保存一定数量文件.

基于以上几点,选择uber开源的日志库 zap.

2.集成到grpc中

2.1 思路

grpc 定义了grpclog包,并定义了LoggerV2的接口,因此,只要通过zap实现LoggerV2的接口,并通过SetLoggerV2(l LoggerV2)接口将实现的对象设置到grpclog包中,那么grpc将使用zap进行日志输出,同时上层应用也可以使用grpclog进行业务日志打印.

2.2 实现

完整代码以及使用示例见 grpc-wrapper

type ZapLogger struct {
    logger *zap.Logger
}

//创建封装了zap的对象,该对象是对LoggerV2接口的实现
func NewZapLogger(logger *zap.Logger) *ZapLogger {
    return &ZapLogger{
        logger: logger,
    }
}
func (zl *ZapLogger) Info(args ...interface{}) {
    zl.logger.Sugar().Info(args...)
}

func (zl *ZapLogger) Infoln(args ...interface{}) {
    zl.logger.Sugar().Info(args...)
}
func (zl *ZapLogger) Infof(format string, args ...interface{}) {
    zl.logger.Sugar().Infof(format, args...)
}

func (zl *ZapLogger) Warning(args ...interface{}) {
    zl.logger.Sugar().Warn(args...)
}

func (zl *ZapLogger) Warningln(args ...interface{}) {
    zl.logger.Sugar().Warn(args...)
}

func (zl *ZapLogger) Warningf(format string, args ...interface{}) {
    zl.logger.Sugar().Warnf(format, args...)
}

func (zl *ZapLogger) Error(args ...interface{}) {
    zl.logger.Sugar().Error(args...)
}

func (zl *ZapLogger) Errorln(args ...interface{}) {
    zl.logger.Sugar().Error(args...)
}

func (zl *ZapLogger) Errorf(format string, args ...interface{}) {
    zl.logger.Sugar().Errorf(format, args...)
}

func (zl *ZapLogger) Fatal(args ...interface{}) {
    zl.logger.Sugar().Fatal(args...)
}

func (zl *ZapLogger) Fatalln(args ...interface{}) {
    zl.logger.Sugar().Fatal(args...)
}

// Fatalf logs to fatal level
func (zl *ZapLogger) Fatalf(format string, args ...interface{}) {
    zl.logger.Sugar().Fatalf(format, args...)
}

// V reports whether verbosity level l is at least the requested verbose level.
func (zl *ZapLogger) V(v int) bool {
    return false
}

3.最终效果

go基于grpc构建微服务框架-结构化日志输出

可以看到,日志以json格式输出,并显示了日志打印时的代码行数,同时当出现error时进行了调用栈的追踪.

参考

grpc
zap.
grpc-wrapper

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/107566.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 跨域访问解决及原因分析_为什么会有跨域问题

    跨域访问解决及原因分析_为什么会有跨域问题转自:https://www.cnblogs.com/itmacy/p/6958181.html跨域问题:解决跨域的三种方案当前端页面与后台运行在不同的服务器时,就必定会出现跨域这一问题,本篇简单介绍解决跨域的三种方案,部分代码截图如下,仅供参考:方式一:使用ajax的jsonp前端代码 服务器代码 使用该方式的缺点:请求方式只能是get请求方式二:使用jQuery的jsonp插件…

  • 更新Git工具到最新版本「建议收藏」

    Ubuntu16.04默认的软件源目前最多只能更新到2.7.4版本,而官方早就已经迭代到2.20.1了,差十几个版本号。新版的git命令工具增加了很多新功能,比如分支HEAD高亮等,相比以前,可以更加方便地脱离图形化界面操作。1、首先查看一下自己的版本是不是低于最新版:git–version2、若不是,添加Git官方的软件源:sudoadd-apt-repositorypp…

  • Java XML解析工具类

    Java XML解析工具类JavaXML解析工具类Java解析XML的方式有很多,这里不一一说明了,利用三方jar包,实现了一个XML工具类本身是有个需求,讲三方公司的XML请求文件中的Response里的属性赋值成java对象,没做完不需要了,只做到了解析,后续本来想利用解析出来的key进行遍历,利用FTL模板生成Java文件,有这个需求的小伙伴可以延续这个工具类。1.看看XML<?xmlversion=”1.0″encoding=”utf-8″?><!–每个协议有Request或Resp

  • DNS解析过程详解「建议收藏」

    DNS解析过程详解「建议收藏」转载原文地址:http://blog.chinaunix.net/uid-28216282-id-3757849.html先说一下DNS的几个基本概念:一.根域就是所谓的“.”,其实我们的网

  • 批处理添加host_批处理修改文件内容

    批处理添加host_批处理修改文件内容一直都是手工修改host文件,这里提供个批处理修改host文件的方法,需要的朋友可以参考下。 @echo127.0.0.1baidu.com>>C:WindowsSystem32Driversetchosts这样就是换一行写入。如果还想换一行,就写:代码如下: @echo.>>C:WindowsSystem32Driversetchosts@echo1

    2022年10月12日
  • war3辅助工具_魔兽世界修改器

    war3辅助工具_魔兽世界修改器War3tools魔兽工具完成于2012年5月,工具包含:版本转换,注册表修复,一键启动游戏,以及将网上好用的改建精灵内置其中。War3tools魔兽工具还可以将自己的工具或者魔兽对战平台加入启动项目,只需在我的工具中添加即可,操作简单,功能实用。希望War3tools魔兽工具能给您的游戏带来方便。@risingsun下载地址:http://pan.baidu.com/share/li

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号