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

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • vuex的五大核心_vue如何实现跨域

    vuex的五大核心_vue如何实现跨域Vuex的核心概念Vuex有5个核心概念,分别是State,Getters,mutations,Actions,Modules。StateVuex使用单一状态树,也就是说,用一个对象包含了所有应

    2022年7月29日
    2
  • jmeter安装教程

    jmeter安装教程基于windows,jmeter4.0版本。1.下载安装包地址:http://jmeter.apache.org/download_jmeter.cgi2.解压,配置环境2.1新增系统变量JMETER_HOME变量值:E:\developer\apache-jmeter-4.0注意,根据自己的路径配置,到这一级就好了。2.2配置classpath在…

    2022年5月3日
    34
  • java 构造函数是如何执行的「建议收藏」

    java 构造函数是如何执行的「建议收藏」1.构造函数不是方法!!  原因1:方法的话,会直接执行方法体内的代码,但是构造函数首先执行的不是{}里的代码块,而是给对象的成员初始化;      2.方法可以被调用其他方法调用,但是构造函数不能被方法或变量调用。  packagecom.statics.www;publicclassSon{//构造函数执行第二步:privateintnum2=

    2022年7月8日
    21
  • perl json encode_json decode_json

    perl json encode_json decode_jsonuse之后使用encode_json命令即可将perl的array或者dic转换为标准的JSON字符串了:jrhmpt01:/root/wx#catjson.pluseJSONqw/encode_jsondecode_json/;my$data=[{‘name’=>’Ken’,’age’=>19},

    2022年7月17日
    27
  • 大数据分析那点事

    写在前文,首先声明博主对数据分析领域也在不断学习当中,文章中难免可能会出现一些错误,欢迎大家及时指正,博主在此之前也曾对不同量级、不同领域的数据进行过分析,但是在过程中总是感觉有许多困惑,即自己也会问自己?自己分析的是否全面,是否有价值,从哪些方面出发?对于这些问题博主做了思考。归根到底还是在理论上,在阅读了相关的专业书籍和材料的基础上总结出本文,希望能给大家带来收获,同时由于内容过多,计划分三次完成全部内容,同时如果大家感觉对自己有帮助的话,记得收藏,博主会不断完善本文的缺陷和不足,希望真正能给大家带来收

    2022年4月8日
    47
  • 微服务精通之Feign原理解析[通俗易懂]

    微服务精通之Feign原理解析[通俗易懂]前言       经过微服务精通之Ribbon原理解析的学习,我们了解到了服务消费者获取服务提供者实例的过程,都是通过RestTemplate来实现的,而且,都是模板化操作。那springcloud是否有哪个组件可以通过注解或者配置的方式,来简化这个过程?答案是有的,就是Feign。一、Feign是什么?       Feign是一个声明式的伪HTTP客户端,

    2022年10月4日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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