log.go 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. package log
  2. import (
  3. "context"
  4. "github.com/logrusorgru/aurora"
  5. "github.com/sagernet/sing/common"
  6. F "github.com/sagernet/sing/common/format"
  7. "github.com/sirupsen/logrus"
  8. )
  9. type Logger interface {
  10. logrus.FieldLogger
  11. WithContext(ctx context.Context) *logrus.Entry
  12. }
  13. type Hook struct{}
  14. func (h *Hook) Levels() []logrus.Level {
  15. return logrus.AllLevels
  16. }
  17. func (h *Hook) Fire(entry *logrus.Entry) error {
  18. if prefix, loaded := entry.Data["prefix"]; loaded {
  19. prefixStr := prefix.(string)
  20. delete(entry.Data, "prefix")
  21. entry.Message = prefixStr + entry.Message
  22. }
  23. if idCtx, loaded := common.Cast[*idContext](entry.Context); loaded {
  24. var color aurora.Color
  25. color = aurora.Color(uint8(idCtx.id))
  26. color %= 215
  27. row := uint(color / 36)
  28. column := uint(color % 36)
  29. var r, g, b float32
  30. r = float32(row * 51)
  31. g = float32(column / 6 * 51)
  32. b = float32((column % 6) * 51)
  33. luma := 0.2126*r + 0.7152*g + 0.0722*b
  34. if luma < 60 {
  35. row = 5 - row
  36. column = 35 - column
  37. color = aurora.Color(row*36 + column)
  38. }
  39. color += 16
  40. color = color << 16
  41. color |= 1 << 14
  42. entry.Message = F.ToString("[", aurora.Colorize(idCtx.id, color).String(), "] ", entry.Message)
  43. }
  44. return nil
  45. }