loghub.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. package log
  2. import (
  3. "bytes"
  4. "encoding/binary"
  5. "fmt"
  6. "git.nspix.com/golang/micro/helper/pool/bufferpool"
  7. "net"
  8. "os"
  9. "time"
  10. )
  11. type LogHub struct {
  12. level int
  13. appName string
  14. prefix string
  15. conn *net.UDPConn
  16. }
  17. func (lg *LogHub) SetLevel(i int) {
  18. lg.level = i
  19. }
  20. func (lg *LogHub) Prefix(s string) {
  21. lg.prefix = s
  22. }
  23. func (lg *LogHub) Print(i ...interface{}) {
  24. lg.write(TraceLevel, fmt.Sprint(i...))
  25. }
  26. func (lg *LogHub) Printf(format string, args ...interface{}) {
  27. lg.write(TraceLevel, fmt.Sprintf(format, args...))
  28. }
  29. func (lg *LogHub) Debug(i ...interface{}) {
  30. lg.write(DebugLevel, fmt.Sprint(i...))
  31. }
  32. func (lg *LogHub) Debugf(format string, args ...interface{}) {
  33. lg.write(DebugLevel, fmt.Sprintf(format, args...))
  34. }
  35. func (lg *LogHub) Info(i ...interface{}) {
  36. lg.write(InfoLevel, fmt.Sprint(i...))
  37. }
  38. func (lg *LogHub) Infof(format string, args ...interface{}) {
  39. lg.write(InfoLevel, fmt.Sprintf(format, args...))
  40. }
  41. func (lg *LogHub) Warn(i ...interface{}) {
  42. lg.write(WarnLevel, fmt.Sprint(i...))
  43. }
  44. func (lg *LogHub) Warnf(format string, args ...interface{}) {
  45. lg.write(WarnLevel, fmt.Sprintf(format, args...))
  46. }
  47. func (lg *LogHub) Error(i ...interface{}) {
  48. lg.write(ErrorLevel, fmt.Sprint(i...))
  49. }
  50. func (lg *LogHub) Errorf(format string, args ...interface{}) {
  51. lg.write(ErrorLevel, fmt.Sprintf(format, args...))
  52. }
  53. func (lg *LogHub) Fatal(i ...interface{}) {
  54. lg.write(FatalLevel, fmt.Sprint(i...))
  55. }
  56. func (lg *LogHub) Fatalf(format string, args ...interface{}) {
  57. lg.write(FatalLevel, fmt.Sprintf(format, args...))
  58. }
  59. func (lg *LogHub) Panic(i ...interface{}) {
  60. lg.write(PanicLevel, fmt.Sprint(i...))
  61. }
  62. func (lg *LogHub) Panicf(format string, args ...interface{}) {
  63. lg.write(PanicLevel, fmt.Sprintf(format, args...))
  64. }
  65. func (lg *LogHub) write(level int, s string) {
  66. if lg.level > level {
  67. return
  68. }
  69. var (
  70. ls string
  71. bf *bytes.Buffer
  72. )
  73. if lg.prefix != "" {
  74. ls += " [" + lg.prefix + "] "
  75. }
  76. ls += s
  77. bf = bufferpool.Get()
  78. defer bufferpool.Put(bf)
  79. // | 1byte level | 8 bytes timestamp | 1 byte name length | n byte name | 2 byte content length | n byte content |
  80. bf.WriteByte(uint8(level))
  81. _ = binary.Write(bf, binary.LittleEndian, uint64(time.Now().Unix()))
  82. bf.WriteByte(uint8(len(lg.appName)))
  83. bf.WriteString(lg.appName)
  84. _ = binary.Write(bf, binary.LittleEndian, uint16(len(ls)))
  85. bf.WriteString(ls)
  86. bf.WriteTo(lg.conn)
  87. }
  88. func NewLogHub(addr string) Logger {
  89. var (
  90. err error
  91. udpAddr *net.UDPAddr
  92. )
  93. if udpAddr, err = net.ResolveUDPAddr("udp", addr); err != nil {
  94. return NewConsoleLogger()
  95. }
  96. hub := &LogHub{
  97. appName: os.Getenv("MICRO_SERVICE_NAME"),
  98. }
  99. hub.conn, err = net.DialUDP("udp", nil, udpAddr)
  100. return hub
  101. }