|
@@ -0,0 +1,90 @@
|
|
|
+//go:build windows
|
|
|
+
|
|
|
+package hiedabke_win_eventlog
|
|
|
+
|
|
|
+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 NewConsoleBackend(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), msg)
|
|
|
+ break
|
|
|
+ }
|
|
|
+ case level.LevelNumber == 3:
|
|
|
+ {
|
|
|
+ _ = b.WinLog.Warning(uint32(level.LevelNumber), msg)
|
|
|
+ break
|
|
|
+ }
|
|
|
+ case level.LevelNumber >= 4:
|
|
|
+ {
|
|
|
+ _ = b.WinLog.Info(uint32(level.LevelNumber), msg)
|
|
|
+ break
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func (b *WinEventLogBackend) EmitComplexLog(module string, level hiedalog.HiedaLogLevel, data map[string]string) {
|
|
|
+ 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()
|
|
|
+}
|