logging.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. package logging
  2. import (
  3. "context"
  4. "fmt"
  5. "google.golang.org/grpc/metadata"
  6. context2 "git.ikuban.com/server/kratos-utils/http/context"
  7. "github.com/go-kratos/kratos/v2/errors"
  8. "github.com/go-kratos/kratos/v2/log"
  9. "github.com/go-kratos/kratos/v2/middleware"
  10. "github.com/go-kratos/kratos/v2/transport/grpc"
  11. "github.com/go-kratos/kratos/v2/transport/http"
  12. )
  13. // Option is HTTP logging option.
  14. type Option func(*options)
  15. type options struct {
  16. logger log.Logger
  17. }
  18. // WithLogger with middleware logger.
  19. func WithLogger(logger log.Logger) Option {
  20. return func(o *options) {
  21. o.logger = logger
  22. }
  23. }
  24. // Server is an server logging middleware.
  25. func Server(opts ...Option) middleware.Middleware {
  26. options := options{
  27. logger: log.DefaultLogger,
  28. }
  29. for _, o := range opts {
  30. o(&options)
  31. }
  32. log := log.NewHelper("middleware/logging", options.logger)
  33. return func(handler middleware.Handler) middleware.Handler {
  34. return func(ctx context.Context, req interface{}) (interface{}, error) {
  35. var (
  36. path string
  37. method string
  38. params string
  39. component string
  40. fromPath string
  41. )
  42. if info, ok := http.FromServerContext(ctx); ok {
  43. component = "HTTP"
  44. path = info.Request.RequestURI
  45. method = info.Request.Method
  46. params = info.Request.Form.Encode()
  47. } else if info, ok := grpc.FromServerContext(ctx); ok {
  48. component = "gRPC"
  49. path = info.FullMethod
  50. method = "POST"
  51. params = req.(fmt.Stringer).String()
  52. if md, ok := metadata.FromIncomingContext(ctx); ok {
  53. _fromPath := md.Get("from_path")
  54. if len(_fromPath) > 0 {
  55. fromPath = _fromPath[0]
  56. }
  57. }
  58. }
  59. if fromPath != "" {
  60. ctx = context2.AppendToContext(ctx, "from_path", fromPath+"|"+path)
  61. } else {
  62. ctx = context2.AppendToContext(ctx, "from_path", path)
  63. }
  64. reply, err := handler(ctx, req)
  65. if err != nil {
  66. log.Errorw(
  67. "kind", "server",
  68. "component", component,
  69. "path", path,
  70. "from", fromPath,
  71. "method", method,
  72. "params", params,
  73. "code", errors.Code(err),
  74. "error", err.Error(),
  75. )
  76. return nil, err
  77. }
  78. return reply, nil
  79. }
  80. }
  81. }
  82. // Client is an client logging middleware.
  83. func Client(opts ...Option) middleware.Middleware {
  84. options := options{
  85. logger: log.DefaultLogger,
  86. }
  87. for _, o := range opts {
  88. o(&options)
  89. }
  90. log := log.NewHelper("middleware/logging", options.logger)
  91. return func(handler middleware.Handler) middleware.Handler {
  92. return func(ctx context.Context, req interface{}) (interface{}, error) {
  93. var (
  94. path string
  95. method string
  96. params string
  97. component string
  98. )
  99. if info, ok := http.FromClientContext(ctx); ok {
  100. component = "HTTP"
  101. path = info.Request.RequestURI
  102. method = info.Request.Method
  103. params = info.Request.Form.Encode()
  104. } else if info, ok := grpc.FromClientContext(ctx); ok {
  105. path = info.FullMethod
  106. method = "POST"
  107. component = "gRPC"
  108. params = req.(fmt.Stringer).String()
  109. }
  110. reply, err := handler(ctx, req)
  111. if err != nil {
  112. log.Errorw(
  113. "kind", "client",
  114. "component", component,
  115. "path", path,
  116. "method", method,
  117. "params", params,
  118. "code", errors.Code(err),
  119. "error", err.Error(),
  120. )
  121. return nil, err
  122. }
  123. return reply, nil
  124. }
  125. }
  126. }