log.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. package log
  2. import (
  3. "fmt"
  4. "os"
  5. "github.com/metacubex/mihomo/common/observable"
  6. log "github.com/sirupsen/logrus"
  7. )
  8. var (
  9. logCh = make(chan Event)
  10. source = observable.NewObservable[Event](logCh)
  11. level = INFO
  12. )
  13. func init() {
  14. log.SetOutput(os.Stdout)
  15. log.SetLevel(log.DebugLevel)
  16. log.SetFormatter(&log.TextFormatter{
  17. FullTimestamp: true,
  18. TimestampFormat: "2006-01-02T15:04:05.999999999Z07:00",
  19. EnvironmentOverrideColors: true,
  20. })
  21. }
  22. type Event struct {
  23. LogLevel LogLevel
  24. Payload string
  25. }
  26. func (e *Event) Type() string {
  27. return e.LogLevel.String()
  28. }
  29. func Infoln(format string, v ...any) {
  30. event := newLog(INFO, format, v...)
  31. logCh <- event
  32. print(event)
  33. }
  34. func Warnln(format string, v ...any) {
  35. event := newLog(WARNING, format, v...)
  36. logCh <- event
  37. print(event)
  38. }
  39. func Errorln(format string, v ...any) {
  40. event := newLog(ERROR, format, v...)
  41. logCh <- event
  42. print(event)
  43. }
  44. func Debugln(format string, v ...any) {
  45. event := newLog(DEBUG, format, v...)
  46. logCh <- event
  47. print(event)
  48. }
  49. func Fatalln(format string, v ...any) {
  50. log.Fatalf(format, v...)
  51. }
  52. func Subscribe() observable.Subscription[Event] {
  53. sub, _ := source.Subscribe()
  54. return sub
  55. }
  56. func UnSubscribe(sub observable.Subscription[Event]) {
  57. source.UnSubscribe(sub)
  58. }
  59. func Level() LogLevel {
  60. return level
  61. }
  62. func SetLevel(newLevel LogLevel) {
  63. level = newLevel
  64. }
  65. func print(data Event) {
  66. if data.LogLevel < level {
  67. return
  68. }
  69. switch data.LogLevel {
  70. case INFO:
  71. log.Infoln(data.Payload)
  72. case WARNING:
  73. log.Warnln(data.Payload)
  74. case ERROR:
  75. log.Errorln(data.Payload)
  76. case DEBUG:
  77. log.Debugln(data.Payload)
  78. }
  79. }
  80. func newLog(logLevel LogLevel, format string, v ...any) Event {
  81. return Event{
  82. LogLevel: logLevel,
  83. Payload: fmt.Sprintf(format, v...),
  84. }
  85. }