kratos
kratos copied to clipboard
grpc/resolver/discovery/resolver.go中日志关闭问题
What happened:
#1935
#1942
在上诉issue中,在discovery中新增了DisableDebugLog()对日志输入进行关闭,但discovery.NewBuilder()是在grpc client创建的内部中调用的
if options.discovery != nil { grpcOpts = append(grpcOpts, grpc.WithResolvers( discovery.NewBuilder( options.discovery, discovery.WithInsecure(insecure), ))) }
无法直接在外部对日志进行关闭, 提议在 grpc.DialInsecure()中增加关闭discovery日志的options
What you expected to happen:
How to reproduce it (as minimally and precisely as possible):
Anything else we need to know?:
Environment:
- Kratos version (use
kratos -v
): v2.5.0
这个功能,感觉有点怪,不知道开始的时候出于什么考虑加上了 DisableDebugLog()。而且他输出的也不是Debug而是info 用日志的等级去控制不是更好么?使用log.NewFilter 包装一下,或者用第三方的日志都能实现日志关闭的效果。 如果想将框架和业务的日志分开控制等级,直接使用两个日志就可以了
我也觉得用日志等级的方式或者一个全局的debug模式跟release模式(类似于gin中控制框架日志输)用来控制框架中的日志的打印.
遇到了同样的问题,我提了个 PR 帮忙 review 一下 @shenqidebaozi @tonybase
线上环境打印大量日志,需要这个特性合入以后将其关闭,请有空帮忙 review 一下,多谢! @haiyux @shenqidebaozi @tonybase
这个功能,感觉有点怪,不知道开始的时候出于什么考虑加上了 DisableDebugLog()。而且他输出的也不是Debug而是info 用日志的等级去控制不是更好么?使用log.NewFilter 包装一下,或者用第三方的日志都能实现日志关闭的效果。 如果想将框架和业务的日志分开控制等级,直接使用两个日志就可以了
当时的解法简单粗暴,因为大量日志的来源都是这一行? “[resolver] update instances: %s” 因此只对这一行做了特殊处理。同时还有一个考虑:如果通过调整级别是不是会其他地方的日志产生影响?比如,我需要某些地方的日志但有不需要这个地方的干扰日志。现在看来,那只是个伪需求,orz~
@deagon PR 没有合并前,如果想要先解决问题,试试这样做:
通过提供 grpc.Option
v := []grpc.ClientOption{
grpc.WithEndpoint("discovery://default/" + AppID),
// grpc.WithDiscovery(nil),
grpc.WithBalancerName(p2c.Name),
grpc.WithMiddleware(middleware.ClientMiddlewareSet()),
grpc.WithOptions(
googlegrpc.WithResolvers(
discovery.NewBuilder(yourDisInstance, discovery.DisableDebugLog(), discovery.WithInsecure(true)),
),
),
}
v = append(v, opts...)
conn, err := grpc.DialInsecure(context.Background(), v...)
if err != nil {
return nil, err
}
另外,PR 的方向是不是可以朝着日志级别 / DEBUG 模式推进?慢慢废弃以前的 option 的控制方式
@yeqown 多谢回复,解决方案看懂了,之前以为无解才"出此下策"。
更优雅的方式确实是废掉这个 option,转成 logger 传递。
https://github.com/go-kratos/kratos/commit/768ffd71d4369b99424458ffbbf287df342a8424