logger.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. package logger
  2. import (
  3. "fmt"
  4. "log"
  5. "net/http"
  6. "os"
  7. "strings"
  8. "time"
  9. "github.com/rollbar/rollbar-go"
  10. "github.com/vladimirok5959/golang-utils/utils/http/helpers"
  11. )
  12. var AccessLogFile = ""
  13. var ErrorLogFile = ""
  14. func appendToLogFile(fileName, msg string) error {
  15. flags := os.O_RDWR | os.O_CREATE | os.O_APPEND
  16. f, err := os.OpenFile(fileName, flags, 0666)
  17. if err != nil {
  18. return err
  19. }
  20. defer f.Close()
  21. if _, err := fmt.Fprint(f, msg); err != nil {
  22. return err
  23. }
  24. return nil
  25. }
  26. func LogInternalError(err error) {
  27. log.Printf("%s\n", err.Error())
  28. if RollBarEnabled && !RollBarSkipErrors.contain(err.Error()) {
  29. rollbar.Error(err)
  30. }
  31. }
  32. func LogRequests(handler http.Handler) http.Handler {
  33. return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
  34. start := time.Now()
  35. nw := &ResponseWriter{
  36. ResponseWriter: w,
  37. Content: []byte{},
  38. Size: 0,
  39. Status: http.StatusOK,
  40. }
  41. handler.ServeHTTP(nw, r)
  42. ua := strings.TrimSpace(r.Header.Get("User-Agent"))
  43. if ua == "" || len(ua) > 256 {
  44. ua = "-"
  45. }
  46. msg := fmt.Sprintf(
  47. "\"%s\" \"%s %s\" %d %d \"%.3f ms\" \"%s\"\n",
  48. strings.Join(helpers.ClientIPs(r), ", "),
  49. r.Method,
  50. r.URL,
  51. nw.Status,
  52. nw.Size,
  53. time.Since(start).Seconds(),
  54. ua,
  55. )
  56. log.Printf("%s", msg)
  57. if nw.Status < 400 {
  58. if AccessLogFile != "" {
  59. if err := appendToLogFile(AccessLogFile, start.Format("2006/01/02 15:04:05")+" "+msg); err != nil {
  60. log.Printf("%s\n", err.Error())
  61. }
  62. }
  63. } else {
  64. if ErrorLogFile != "" {
  65. if err := appendToLogFile(ErrorLogFile, start.Format("2006/01/02 15:04:05")+" "+msg); err != nil {
  66. log.Printf("%s\n", err.Error())
  67. }
  68. }
  69. }
  70. if RollBarEnabled && !RollBarSkipStatusCodes.contain(nw.Status) {
  71. if !RollBarSkipErrors.contain(string(nw.Content)) {
  72. rollbar.Error(r, nw.Status, nw.Size, string(nw.Content))
  73. }
  74. }
  75. })
  76. }