win_eventlog.go 1.9 KB

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