podman
72 строки · 1.4 Кб
1//go:build windows
2
3package main
4
5import (
6"bytes"
7"fmt"
8
9"github.com/sirupsen/logrus"
10"golang.org/x/sys/windows/svc/eventlog"
11)
12
13// Logrus hook that delegates to windows event log
14type EventLogHook struct {
15events *eventlog.Log
16}
17
18type LogFormat struct {
19name string
20}
21
22func (f *LogFormat) Format(entry *logrus.Entry) ([]byte, error) {
23var b *bytes.Buffer
24
25if entry.Buffer != nil {
26b = entry.Buffer
27} else {
28b = &bytes.Buffer{}
29}
30
31fmt.Fprintf(b, "[%-5s] %s: %s", entry.Level.String(), f.name, entry.Message)
32
33for key, value := range entry.Data {
34fmt.Fprintf(b, " {%s = %s}", key, value)
35}
36
37b.WriteByte('\n')
38return b.Bytes(), nil
39}
40
41func NewEventHook(events *eventlog.Log, name string) *EventLogHook {
42logrus.SetFormatter(&LogFormat{name})
43return &EventLogHook{events}
44}
45
46func (hook *EventLogHook) Fire(entry *logrus.Entry) error {
47line, err := entry.String()
48if err != nil {
49return err
50}
51
52switch entry.Level {
53case logrus.PanicLevel:
54return hook.events.Error(1002, line)
55case logrus.FatalLevel:
56return hook.events.Error(1001, line)
57case logrus.ErrorLevel:
58return hook.events.Error(1000, line)
59case logrus.WarnLevel:
60return hook.events.Warning(1000, line)
61case logrus.InfoLevel:
62return hook.events.Info(1000, line)
63case logrus.DebugLevel, logrus.TraceLevel:
64return hook.events.Info(1001, line)
65default:
66return nil
67}
68}
69
70func (hook *EventLogHook) Levels() []logrus.Level {
71return logrus.AllLevels
72}
73