logging.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. package logging
  2. import (
  3. "context"
  4. "fmt"
  5. "git.ikuban.com/server/kratos-utils/http/param"
  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. )
  41. if info, ok := http.FromServerContext(ctx); ok {
  42. component = "HTTP"
  43. path = info.Request.RequestURI
  44. method = info.Request.Method
  45. params = info.Request.Form.Encode()
  46. } else if info, ok := grpc.FromServerContext(ctx); ok {
  47. component = "gRPC"
  48. path = info.FullMethod
  49. method = "POST"
  50. params = req.(fmt.Stringer).String()
  51. }
  52. fromPath := param.GetFromPath(ctx)
  53. if fromPath != "" {
  54. ctx = context2.AppendToContext(ctx, "from_path", fromPath+"|"+path)
  55. } else {
  56. ctx = context2.AppendToContext(ctx, "from_path", path)
  57. }
  58. reply, err := handler(ctx, req)
  59. if err != nil {
  60. log.Errorw(
  61. "kind", "server",
  62. "component", component,
  63. "path", path,
  64. "from", fromPath,
  65. "method", method,
  66. "params", params,
  67. "code", errors.Code(err),
  68. "error", err.Error(),
  69. )
  70. return nil, err
  71. }
  72. return reply, nil
  73. }
  74. }
  75. }
  76. // Client is an client logging middleware.
  77. func Client(opts ...Option) middleware.Middleware {
  78. options := options{
  79. logger: log.DefaultLogger,
  80. }
  81. for _, o := range opts {
  82. o(&options)
  83. }
  84. log := log.NewHelper("middleware/logging", options.logger)
  85. return func(handler middleware.Handler) middleware.Handler {
  86. return func(ctx context.Context, req interface{}) (interface{}, error) {
  87. var (
  88. path string
  89. method string
  90. params string
  91. component string
  92. )
  93. if info, ok := http.FromClientContext(ctx); ok {
  94. component = "HTTP"
  95. path = info.Request.RequestURI
  96. method = info.Request.Method
  97. params = info.Request.Form.Encode()
  98. } else if info, ok := grpc.FromClientContext(ctx); ok {
  99. path = info.FullMethod
  100. method = "POST"
  101. component = "gRPC"
  102. params = req.(fmt.Stringer).String()
  103. }
  104. reply, err := handler(ctx, req)
  105. if err != nil {
  106. log.Errorw(
  107. "kind", "client",
  108. "component", component,
  109. "path", path,
  110. "method", method,
  111. "params", params,
  112. "code", errors.Code(err),
  113. "error", err.Error(),
  114. )
  115. return nil, err
  116. }
  117. return reply, nil
  118. }
  119. }
  120. }