logging.go 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. package router
  2. import (
  3. "net"
  4. "net/http"
  5. "github.com/imgproxy/imgproxy/v3/ierrors"
  6. log "github.com/sirupsen/logrus"
  7. )
  8. func LogRequest(reqID string, r *http.Request) {
  9. path := r.RequestURI
  10. clientIP, _, _ := net.SplitHostPort(r.RemoteAddr)
  11. log.WithFields(log.Fields{
  12. "request_id": reqID,
  13. "method": r.Method,
  14. "client_ip": clientIP,
  15. }).Infof("Started %s", path)
  16. }
  17. func LogResponse(reqID string, r *http.Request, status int, err *ierrors.Error, additional ...log.Fields) {
  18. var level log.Level
  19. switch {
  20. case status >= 500 || (err != nil && err.StatusCode() >= 500):
  21. level = log.ErrorLevel
  22. case status >= 400:
  23. level = log.WarnLevel
  24. default:
  25. level = log.InfoLevel
  26. }
  27. clientIP, _, _ := net.SplitHostPort(r.RemoteAddr)
  28. fields := log.Fields{
  29. "request_id": reqID,
  30. "method": r.Method,
  31. "status": status,
  32. "client_ip": clientIP,
  33. }
  34. if err != nil {
  35. fields["error"] = err
  36. if level <= log.ErrorLevel {
  37. if stack := err.FormatStack(); len(stack) > 0 {
  38. fields["stack"] = stack
  39. }
  40. }
  41. }
  42. for _, f := range additional {
  43. for k, v := range f {
  44. fields[k] = v
  45. }
  46. }
  47. log.WithFields(fields).Logf(
  48. level,
  49. "Completed in %s %s", ctxTime(r.Context()), r.RequestURI,
  50. )
  51. }