Kratos日志

article/2025/10/5 14:18:02

一.如何在kratos框架中使用

参考官方文档中描述,为了方便业务自适配不同的 log 接入使用,Logger 只包含了最简单的 Log 接口。当业务需要在 Kratos 框架内部使用自定义的 log的时候,只需要简单实现方法即可。日志库较为公用建议放在kit基础库中方便其他微服务引用。在kratos日志中,很多时候是输出到控制台的,但是实践中更多的是为了打印到文本中。

1.实现log接口并配置zap日志库编码

package logimport ("fmt""time""github.com/go-kratos/kratos/v2/log""github.com/natefinch/lumberjack""go.uber.org/zap""go.uber.org/zap/zapcore"
)var _ log.Logger = (*ZapLogger)(nil)// ZapLogger is a logger impl.
type ZapLogger struct {log  *zap.LoggerSync func() error
}// NewZapLogger return a zap logger.
func NewZapLogger(encoder zapcore.EncoderConfig, level zap.AtomicLevel, opts ...zap.Option) *ZapLogger {dateTime := time.Now().Format("2006_01_02_15_04_05")lumberJackLogger := &lumberjack.Logger{Filename:   "./log/" + dateTime + "test.log",MaxSize:    1, //修改文本大小,默认为1 MBMaxBackups: 5,MaxAge:     30,Compress:   false,}core := zapcore.NewCore(zapcore.NewConsoleEncoder(encoder),zapcore.NewMultiWriteSyncer(//zapcore.AddSync(os.Stdout),  //输出到控制台上zapcore.AddSync(lumberJackLogger), //输出到文本中), level)zapLogger := zap.New(core, opts...)return &ZapLogger{log: zapLogger, Sync: zapLogger.Sync}
}// Log Implementation of logger interface.
func (l *ZapLogger) Log(level log.Level, keyvals ...interface{}) error {if len(keyvals) == 0 || len(keyvals)%2 != 0 {l.log.Warn(fmt.Sprint("Keyvalues must appear in pairs: ", keyvals))return nil}// Zap.Field is used when keyvals pairs appearvar data []zap.Fieldfor i := 0; i < len(keyvals); i += 2 {data = append(data, zap.Any(fmt.Sprint(keyvals[i]), fmt.Sprint(keyvals[i+1])))}switch level {case log.LevelDebug:l.log.Debug("", data...)case log.LevelInfo:l.log.Info("", data...)case log.LevelWarn:l.log.Warn("", data...)case log.LevelError:l.log.Error("", data...)}return nil
}

二.替换为zap日志库

package mainimport ("flag""os""blog/internal/conf"zaplog "blog/cmd/blog/zap""time""github.com/go-kratos/kratos/v2""github.com/go-kratos/kratos/v2/config""github.com/go-kratos/kratos/v2/config/file""github.com/go-kratos/kratos/v2/log""github.com/go-kratos/kratos/v2/middleware/tracing""github.com/go-kratos/kratos/v2/transport/grpc""github.com/go-kratos/kratos/v2/transport/http""github.com/natefinch/lumberjack""go.uber.org/zap""go.uber.org/zap/zapcore"
)var sugarLogger *zap.SugaredLogger// go build -ldflags "-X main.Version=x.y.z"
var (// Name is the name of the compiled software.Name string// Version is the version of the compiled software.Version string// flagconf is the config flag.flagconf stringid, _ = os.Hostname()
)func init() {flag.StringVar(&flagconf, "conf", "../../configs", "config path, eg: -conf config.yaml")
}func newApp(logger log.Logger, hs *http.Server, gs *grpc.Server) *kratos.App {return kratos.New(kratos.ID(id),kratos.Name(Name),kratos.Version(Version),kratos.Metadata(map[string]string{}),kratos.Logger(logger),kratos.Server(hs,gs,),)
}func main() {encoder := zapcore.EncoderConfig{TimeKey:        "t",LevelKey:       "level",NameKey:        "logger",CallerKey:      "caller",MessageKey:     "msg",StacktraceKey:  "stack",EncodeTime:     zapcore.ISO8601TimeEncoder,LineEnding:     zapcore.DefaultLineEnding,EncodeLevel:    zapcore.LowercaseLevelEncoder,EncodeDuration: zapcore.SecondsDurationEncoder,EncodeCaller:   zapcore.FullCallerEncoder,}zlogger := zaplog.NewZapLogger(encoder,zap.NewAtomicLevelAt(zapcore.DebugLevel),zap.AddStacktrace(zap.NewAtomicLevelAt(zapcore.ErrorLevel)),zap.AddCaller(),zap.AddCallerSkip(2),zap.Development(),)zlog := log.NewHelper(zlogger)zlog.Infow("name", "kratos", "from", "opensource")//原有的输出到控制台上//logger := log.With(log.NewStdLogger(os.Stdout),//输出到日志中logger := log.With(zlogger,"ts", log.DefaultTimestamp,"caller", log.DefaultCaller,"service.id", id,"service.name", Name,"service.version", Version,"trace_id", tracing.TraceID(),"span_id", tracing.SpanID(),)c := config.New(config.WithSource(file.NewSource(flagconf),),)defer c.Close()//去掉初始化日志//InitLogger()//defer sugarLogger.Sync()//url := "www.baidu.com"///sugarLogger.Debugf("Trying to hit GET request for %s", url)if err := c.Load(); err != nil {panic(err)}var bc conf.Bootstrapif err := c.Scan(&bc); err != nil {panic(err)}app, cleanup, err := initApp(bc.Server, bc.Data, logger)if err != nil {panic(err)}defer cleanup()// start and wait for stop signalif err := app.Run(); err != nil {panic(err)}
}func InitLogger() {writeSyncer := getLogWriter()encoder := getEncoder()core := zapcore.NewCore(encoder, writeSyncer, zapcore.DebugLevel)logger := zap.New(core, zap.AddCaller())sugarLogger = logger.Sugar()
}func getEncoder() zapcore.Encoder {encoderConfig := zap.NewProductionEncoderConfig()encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoderencoderConfig.EncodeLevel = zapcore.CapitalLevelEncoderreturn zapcore.NewConsoleEncoder(encoderConfig)
}func getLogWriter() zapcore.WriteSyncer {dateTime := time.Now().Format("2006_01_02_15_04_05")lumberJackLogger := &lumberjack.Logger{Filename:   "./log/" + dateTime + "test.log",MaxSize:    1,  //默认1MBMaxBackups: 5,MaxAge:     30,Compress:   false,}return zapcore.AddSync(lumberJackLogger)
}

在main函数中将元日志替换为zap日志

logger := log.With(zlogger,"ts", log.DefaultTimestamp,"caller", log.DefaultCaller,"service.id", id,"service.name", Name,"service.version", Version,"trace_id", tracing.TraceID(),"span_id", tracing.SpanID(),)

三.打印出来的日志

在这里插入图片描述
在这里插入图片描述


http://chatgpt.dhexx.cn/article/RU8ewlb4.shtml

相关文章

kratos框架学习,在Linux 下面使用kratos 创建demo 项目然后跑起来。使用 kratos new kratos-demo 一键创建项目,脚手架非常方便。但是依赖grpc没有起来

目录 前言1&#xff0c;关于kratos2&#xff0c;使用 kratos new kratos-demo 一键创建项目3&#xff0c;解决gRPC 编译问题4&#xff0c;只创建HTTP服务 前言 本文的原文连接是: https://blog.csdn.net/freewebsys/article/details/109139648 未经博主允许不得转载。 博主地址…

砥砺前行 | Kratos 框架 v2 版本架构演进之路

Kratos 是一套轻量级 Go 微服务框架&#xff0c;包含大量微服务相关功能及工具。名字来源于游戏《战神》&#xff0c;该游戏以希腊神话为背景&#xff0c;讲述了奎托斯&#xff08;Kratos&#xff09;由凡人成为战神并展开弑神屠杀的冒险历程。 写在前面 从 2021 年 2 月份&…

【kratos入门实战教程】1-kratos项目搭建和开发环境配置

1、系列目录 【kratos入门实战教程】0-商城项目介绍【kratos入门实战教程】1-kratos项目搭建和开发环境配置【kratos入门实战教程】2-实现注册登陆业务 2、概览 经过上一篇的说明&#xff0c;本篇教程正式开始搭建项目。深入解析工程项目的目录结构和介绍一些开发需要使用的工…

go微服务框架Kratos简单使用总结

Kratos是B站开源的一款go的微服务框架&#xff0c;最近PS5上的 战神诸神黄昏比较火&#xff0c;主角就是奎托斯。这个框架的名字就取自他。 在进行框架选型时&#xff0c;对比了目前主流的很多go微服务框架&#xff0c;如Zero&#xff0c;最后对比之下&#xff0c;选择了Krato…

c语言代码后return0表示什么意思,C语言中return 0 表示什么

满意答案 强计划止步不.. 2013.01.03 采纳率&#xff1a;44% 等级&#xff1a;12 已帮助&#xff1a;7948人 return表示函数结束, 也就是说CPU执行到return后, 就会跳转(如果要好理解的话, 是"回到")到调用它的地方, 然后继续执行. 而0, 是一个整型, 一般来说retu…

c语言代码后return0表示什么意思,return 0是什么意思 ?

return 0 代表告诉调用者程序是正常退出的。return是C预定义的语句&#xff0c;它提供了终止函数执行的一种方式。当return语句提供了一个值时&#xff0c;这个值就成为函数的返回值。 这个return语句结束main()函数的执行&#xff0c;把0返还给操作系统。从main()函数返回0表…

接口性能测试方案

一、 性能测试术语解释 1. 响应时间 响应时间即从应用系统发出请求开始&#xff0c;到客户端接收到最后一个字节数据为止所消耗的时间。响应时间按软件的特点再可以细分&#xff0c;如对于一个 C/S 软件&#xff08;B/S一样&#xff09;的响应时间可以细分为网络传输时间、应…

软件性能测试方案-性能测试准备

性能测试目的 1、性能调优 开发人员对系统调优后&#xff0c;需要测试人员配合去做性能测试&#xff0c;验证这次优化是否有效果。如果性能指标相比较之前的性能指标更好了&#xff0c;说明系统优化的有效果。反之说明调优不理想 2、新业务、新接口上线 系统从无到上线&…

参考文档一:性能测试---测试方案

性能测试详细测试方案 前言 平台XX项目系统已经成功发布&#xff0c;依据项目的规划&#xff0c;未来势必会出现业务系统中信息大量增长的态势。 随着业务系统在生产状态下日趋稳定、成熟&#xff0c;系统的性能问题也逐步成为了我们关注的焦点&#xff1a;每天大数据量的“…

【性能测试】性能测试方案设计

性能测试方案设计 1. 性能测试流程 系统架构调研 业务模型分析调研 测试需求分析设计测试方案测试环境搭建测试数据准备测试工具开发测试场景设置执行场景测试测试结果分析提交测试报告 2. 性能测试需求分析和范围确定 收集性能需求信息分析应用程序 系统设计和架构信息网…

接口性能测试方案 白皮书 V1.0

一、 性能测试术语解释 1. 响应时间 响应时间即从应用系统发出请求开始&#xff0c;到客户端接收到最后一个字节数据为止所消耗的时间。响应时间按软件的特点再可以细分&#xff0c;如对于一个 C/S 软件的响应时间可以细分为网络传输时间、应用服务器处理时间、数据库服务器处…

性能测试案例

做性能测试之前需要对Linux内核参数优化 Linux内核参数优化 Linux服务器默认支持1024个TCP链接&#xff0c;在性能测试时&#xff0c;无论压力机还是项目服务器&#xff0c;都需要对tcp参数进行一些优化 ulimit -n&#xff1a;查看当前Linux系统最大的连接数 修改Linux系统允许…

性能测试(一)

一)谈谈你对于性能测试的理解: 1)性能测试的概念 测试目的与功能测试的区别性能测试的指标 2)性能测试需要借助工具来进行测试&#xff0c;可以说说自己是用了哪些工具以及如何使用工具来进行性能测试 3)为了避免面试官在性能测试方面进行深究&#xff0c;主动说性能测试难就难…

最全面性能测试方案模板

性能测试方案书 1 简介 1.1目的 编写本文档的目的在于描述测试项目的测试范围&#xff0c;定义测试条件和目标&#xff0c;测试策略和要求&#xff0c;分析可能的风险&#xff0c;提供相应的规避措施或应急对策&#xff0c;并确定测试整体进度的计划和人力资源安排等。 测试目…

性能测试介绍

转载来源 公众号《测试开发技术》 1.性能测试要开专栏了 提起性能测试&#xff0c;可能很多互联网从业人员会感觉比较混淆&#xff08;不仅仅只是测试人员会弄混淆&#xff0c;很多开发人员、管理人员对性能测试也都是一知半解&#xff09;。性能测试&#xff0c;它是属于测试…

性能测试流程-性能测试2

性能测试流程 1. 性能测试需求分析 2. 性能测试计划及方案 3. 性能测试用例 4. 搭建测试环境 5. 测试数据准备 6. 测试脚本编写 7. 执行测试脚本 8. 性能测试监控 9. 性能分析和调优 10. 性能测试回归 11. 性能测试报告总结 1、性能测试需求分析 熟悉被测系统 熟…

【测试方案】性能方案设计

什么是性能测试&#xff1f; 压力测试&#xff1a;强调极端暴力 稳定性测试&#xff1a;在一定压力下&#xff0c;长时间运行的情况 基准测试&#xff1a;在特定条件下的性能测试 负载测试&#xff1a;不同负载下的表现 容量测试&#xff1a;最优容量 性能测试方案设计流程 需…

性能测试—性能测试方案设计思路总结

一、需求分析 1.测试目的 为什么测&#xff1f;目的在于测试系统相关性能能否满足业务需求。通常分以下两种情况&#xff1a; 1&#xff09;新项目上线 2&#xff09;老项目优化 如果是老项目优化&#xff0c;可考虑是否存有历史测试方案&#xff0c;如果有可以参考&#…

性能测试计划及方案

说明&#xff1a;性能测试实施第一份文档&#xff0c;也是最重要的一份文档。 主要内容&#xff1a; 1、项目背景 项目是用来做什么的 2、测试目标 确定此次性能测试的目标&#xff0c;决定测试策略&#xff08;下文&#xff09; 3、人员安排 明确性能测试的时间&#xff0c…

性能测试详细测试方案

性能测试详细测试方案 前言 平台XX项目系统已经成功发布&#xff0c;依据项目的规划&#xff0c;未来势必会出现业务系统中信息大量增长的态势。 随着业务系统在生产状态下日趋稳定、成熟&#xff0c;系统的性能问题也逐步成为了我们关注的焦点&#xff1a;每天大数据量的“…