logging.go 3.0 KB

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