win_eventlog.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. //go:build windows
  2. package hiedabke_win_eventlog
  3. import (
  4. "fmt"
  5. "git.swzry.com/zry/GoHiedaLogger/hiedalog"
  6. "golang.org/x/sys/windows/svc/eventlog"
  7. "strings"
  8. )
  9. type WinEventLogBackend struct {
  10. WinLog *eventlog.Log
  11. enable bool
  12. }
  13. var _ = hiedalog.HiedaLogBackend(&WinEventLogBackend{WinLog: nil})
  14. func NewConsoleBackend(logger *eventlog.Log) *WinEventLogBackend {
  15. scb := &WinEventLogBackend{
  16. WinLog: logger,
  17. enable: true,
  18. }
  19. return scb
  20. }
  21. func (b *WinEventLogBackend) Shutdown() {
  22. b.enable = false
  23. _ = b.WinLog.Close()
  24. }
  25. func (b *WinEventLogBackend) EmitStringLog(module string, level hiedalog.HiedaLogLevel, content string) {
  26. if !b.enable {
  27. return
  28. }
  29. msg := fmt.Sprintf("<%s> [%s] %s\n", level.Name, module, content)
  30. switch {
  31. case level.LevelNumber < 3:
  32. {
  33. _ = b.WinLog.Error(uint32(level.LevelNumber), msg)
  34. break
  35. }
  36. case level.LevelNumber == 3:
  37. {
  38. _ = b.WinLog.Warning(uint32(level.LevelNumber), msg)
  39. break
  40. }
  41. case level.LevelNumber >= 4:
  42. {
  43. _ = b.WinLog.Info(uint32(level.LevelNumber), msg)
  44. break
  45. }
  46. }
  47. }
  48. func (b *WinEventLogBackend) EmitComplexLog(module string, level hiedalog.HiedaLogLevel, data map[string]string) {
  49. if !b.enable {
  50. return
  51. }
  52. b.EmitStringLog(module, level, b.prettyComplexToString(data))
  53. }
  54. func (b *WinEventLogBackend) prettyComplexToString(data map[string]string) string {
  55. sb := strings.Builder{}
  56. scn := 0
  57. xr := false
  58. if len(data) < 5 {
  59. for k, v := range data {
  60. scn += len(k) + len(v) + 2
  61. if scn > 160 {
  62. xr = true
  63. break
  64. }
  65. sb.WriteString(k)
  66. sb.WriteRune(':')
  67. sb.WriteString(v)
  68. sb.WriteString(", ")
  69. }
  70. if !xr {
  71. so := sb.String()
  72. return so[:len(so)-2]
  73. }
  74. }
  75. sb = strings.Builder{}
  76. sb.WriteRune('\n')
  77. for k, v := range data {
  78. sb.WriteString(k)
  79. sb.WriteRune(':')
  80. sb.WriteString(v)
  81. sb.WriteRune('\n')
  82. }
  83. return sb.String()
  84. }