prettylog.go 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. package prettylog
  2. import (
  3. "fmt"
  4. "log"
  5. "runtime"
  6. "strings"
  7. "time"
  8. )
  9. type PrettyLogWritter struct {
  10. prefix string
  11. lastTime time.Time
  12. counter int64
  13. }
  14. func NewWriter(prefix string) *PrettyLogWritter {
  15. return &PrettyLogWritter{prefix, time.Now(), 0}
  16. }
  17. func (p *PrettyLogWritter) Write(b []byte) (int, error) {
  18. /*{
  19. for i := 0; i < 6; i++ {
  20. ptr, _, _, _ := runtime.Caller(i)
  21. fname := runtime.FuncForPC(ptr).Name()
  22. fmt.Println("Stack:", fname)
  23. }
  24. }*/
  25. ptr, _, line, _ := runtime.Caller(3)
  26. tname := runtime.FuncForPC(ptr).Name()
  27. li := strings.LastIndex(tname, "/")
  28. fname := tname[li+1:]
  29. timeDiff := time.Since(p.lastTime)
  30. var fduration float64 = float64(timeDiff.Nanoseconds()) / 1000000.0
  31. prefixStr := ""
  32. if p.prefix != "" {
  33. prefixStr = "<\033[35m" + p.prefix + "\033[0m> "
  34. }
  35. msg := fmt.Sprintf("[%d:\033[34m%s\033[0m (\033[33m%s:%d\033[0m) %s\033[90m+%.2f/ms\033[0m]: %s",
  36. p.counter,
  37. time.Now().Format("2006-01-02 15:04:05"),
  38. fname,
  39. line,
  40. prefixStr,
  41. fduration,
  42. string(b),
  43. )
  44. p.lastTime = time.Now()
  45. p.counter++
  46. return fmt.Print(msg)
  47. }
  48. func New(prefix string) *log.Logger {
  49. return log.New(NewWriter(prefix), "", 0)
  50. }
  51. func Global() {
  52. log.SetFlags(0)
  53. log.SetOutput(NewWriter(""))
  54. }