|
@@ -0,0 +1,98 @@
|
|
|
+//go:build windows
|
|
|
+
|
|
|
+package hiedabke_win_eventlog
|
|
|
+
|
|
|
+import (
|
|
|
+ "fmt"
|
|
|
+ "git.swzry.com/zry/GoHiedaLogger/hiedalog"
|
|
|
+ "github.com/kardianos/service"
|
|
|
+ "strings"
|
|
|
+)
|
|
|
+
|
|
|
+type SvcLoggerBackend struct {
|
|
|
+ SvcLog *service.WindowsLogger
|
|
|
+ enable bool
|
|
|
+}
|
|
|
+
|
|
|
+var _ = hiedalog.HiedaLogBackend(&SvcLoggerBackend{SvcLog: nil})
|
|
|
+
|
|
|
+func NewSvcLoggerBackend(logger *service.WindowsLogger) *SvcLoggerBackend {
|
|
|
+ scb := &SvcLoggerBackend{
|
|
|
+ SvcLog: logger,
|
|
|
+ enable: false,
|
|
|
+ }
|
|
|
+ return scb
|
|
|
+}
|
|
|
+
|
|
|
+func (b *SvcLoggerBackend) Enable() {
|
|
|
+ if b.SvcLog != nil {
|
|
|
+ b.enable = true
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func (b *SvcLoggerBackend) Shutdown() {
|
|
|
+ b.enable = false
|
|
|
+}
|
|
|
+
|
|
|
+func (b *SvcLoggerBackend) 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.SvcLog.NError(uint32(level.LevelNumber), msg)
|
|
|
+ break
|
|
|
+ }
|
|
|
+ case level.LevelNumber == 3:
|
|
|
+ {
|
|
|
+ _ = b.SvcLog.NWarning(uint32(level.LevelNumber), msg)
|
|
|
+ break
|
|
|
+ }
|
|
|
+ case level.LevelNumber >= 4:
|
|
|
+ {
|
|
|
+ _ = b.SvcLog.NInfo(uint32(level.LevelNumber), msg)
|
|
|
+ break
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func (b *SvcLoggerBackend) EmitComplexLog(module string, level hiedalog.HiedaLogLevel, data map[string]string) {
|
|
|
+ if !b.enable {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ b.EmitStringLog(module, level, b.prettyComplexToString(data))
|
|
|
+}
|
|
|
+
|
|
|
+func (b *SvcLoggerBackend) 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()
|
|
|
+}
|