prettylog.go 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  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. msg := fmt.Sprintf("[%d:\033[34m%s\033[0m (\033[33m%s:%d\033[0m) <\033[35m%s\033[0m> \033[90m+%.2f/ms\033[0m]: %s",
  32. p.counter,
  33. time.Now().Format("2006-01-02 15:04:05"),
  34. fname,
  35. line,
  36. p.prefix,
  37. fduration,
  38. string(b),
  39. )
  40. p.lastTime = time.Now()
  41. p.counter++
  42. return fmt.Print(msg)
  43. }
  44. func New(prefix string) *log.Logger {
  45. return log.New(NewWriter(prefix), "", 0)
  46. }
  47. func Global() {
  48. log.SetFlags(0)
  49. log.SetOutput(NewWriter(""))
  50. }