prettylog.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. package prettylog
  2. import (
  3. "fmt"
  4. "log"
  5. "os"
  6. "runtime"
  7. "strings"
  8. "time"
  9. "golang.org/x/crypto/ssh/terminal"
  10. )
  11. var (
  12. style = NewStyle()
  13. )
  14. type PrettyLogWritter struct {
  15. prefix string
  16. lastTime time.Time
  17. counter int64
  18. // Flags??
  19. }
  20. func NewWriter(prefix string) *PrettyLogWritter {
  21. return &PrettyLogWritter{prefix, time.Now(), 0}
  22. }
  23. func (p *PrettyLogWritter) Write(b []byte) (int, error) {
  24. if len(b) == 0 {
  25. return 0, nil
  26. }
  27. originalLen := len(b)
  28. parts := strings.Split(string(b), "\n")
  29. if len(parts) > 2 {
  30. for _, v := range parts {
  31. p.Write([]byte(v))
  32. }
  33. return originalLen, nil
  34. }
  35. msg := parts[0]
  36. /*{
  37. for i := 0; i < 6; i++ {
  38. ptr, _, _, _ := runtime.Caller(i)
  39. fname := runtime.FuncForPC(ptr).Name()
  40. fmt.Println("Stack:", fname)
  41. }
  42. }*/
  43. ptr, _, line, _ := runtime.Caller(3)
  44. tname := runtime.FuncForPC(ptr).Name()
  45. li := strings.LastIndex(tname, "/")
  46. fname := tname[li+1:]
  47. timeDiff := time.Since(p.lastTime)
  48. fdurationSuf := "ms"
  49. fduration := float64(timeDiff.Nanoseconds()) / 1000000.0
  50. if fduration > 100 {
  51. fduration /= 1000
  52. fdurationSuf = "s"
  53. }
  54. prefixStr := ""
  55. if p.prefix != "" {
  56. prefixStr = fmt.Sprintf(" %s", p.prefix)
  57. }
  58. if !terminal.IsTerminal(int(os.Stderr.Fd())) {
  59. style.Disabled = true
  60. }
  61. //msg := fmt.Sprintf("[%d:\033[34m%s\033[0m (\033[33m%s:%d\033[0m) %s\033[90m+%.2f/ms\033[0m]: %s",
  62. str := fmt.Sprintf("[%s%s]: %s %s %s\n",
  63. style.Get("Time", time.Now().Format("2006-01-02 15:04:05.000")),
  64. style.Get("Prefix", prefixStr),
  65. style.Get("Message", msg),
  66. style.Get("Duration", fmt.Sprintf("+%.2f/%s", fduration, fdurationSuf)),
  67. style.GetX("File", fmt.Sprintf("%s:%d", fname, line)),
  68. )
  69. p.lastTime = time.Now()
  70. p.counter++
  71. n, err := os.Stderr.Write([]byte(str))
  72. if err != nil {
  73. return n, err
  74. }
  75. return originalLen, nil
  76. }
  77. func New(prefix string) *log.Logger {
  78. return log.New(NewWriter(prefix), "", 0)
  79. }
  80. func Global() {
  81. log.SetFlags(0)
  82. log.SetOutput(NewWriter(""))
  83. }