//go:build windows package hiedabke_kardianos_svc_logger import ( "fmt" "git.swzry.com/zry/GoHiedaLogger/hiedalog" "golang.org/x/sys/windows/svc/eventlog" "strings" ) type WinEventLogBackend struct { WinLog *eventlog.Log enable bool } var _ = hiedalog.HiedaLogBackend(&WinEventLogBackend{WinLog: nil}) func NewWinEventLogBackend(logger *eventlog.Log) *WinEventLogBackend { scb := &WinEventLogBackend{ WinLog: logger, enable: true, } return scb } func (b *WinEventLogBackend) Shutdown() { b.enable = false _ = b.WinLog.Close() } func (b *WinEventLogBackend) EmitStringLog(module string, level hiedalog.HiedaLogLevel, content string) { if !b.enable { return } msg := fmt.Sprintf("<%s> [%s] %s\n", level.Name, module, content) switch { case level.LevelNumber < 3: { _ = b.WinLog.Error(uint32(level.LevelNumber)+1, msg) break } case level.LevelNumber == 3: { _ = b.WinLog.Warning(uint32(level.LevelNumber)+1, msg) break } case level.LevelNumber >= 4: { _ = b.WinLog.Info(uint32(level.LevelNumber)+1, msg) break } } } func (b *WinEventLogBackend) EmitComplexLog(module string, level hiedalog.HiedaLogLevel, data map[string]string) { if !b.enable { return } b.EmitStringLog(module, level, b.prettyComplexToString(data)) } func (b *WinEventLogBackend) prettyComplexToString(data map[string]string) string { sb := strings.Builder{} scn := 0 xr := false if len(data) < 5 { for k, v := range data { scn += len(k) + len(v) + 2 if scn > 160 { xr = true break } sb.WriteString(k) sb.WriteRune(':') sb.WriteString(v) sb.WriteString(", ") } if !xr { so := sb.String() return so[:len(so)-2] } } sb = strings.Builder{} sb.WriteRune('\n') for k, v := range data { sb.WriteString(k) sb.WriteRune(':') sb.WriteString(v) sb.WriteRune('\n') } return sb.String() }