2021-08-24 04:37:44 +08:00
|
|
|
//go:build windows
|
2021-01-20 00:03:19 +08:00
|
|
|
|
2019-08-29 05:34:44 +08:00
|
|
|
package logger
|
|
|
|
|
|
|
|
|
|
import (
|
2024-06-25 21:48:56 +08:00
|
|
|
"fmt"
|
2021-01-20 00:03:19 +08:00
|
|
|
"log"
|
2024-07-26 23:09:21 +08:00
|
|
|
"os"
|
|
|
|
|
"time"
|
2019-08-29 05:34:44 +08:00
|
|
|
|
2021-01-20 00:03:19 +08:00
|
|
|
"golang.org/x/sys/windows/svc/eventlog"
|
2025-02-25 09:37:12 +08:00
|
|
|
|
|
|
|
|
"github.com/influxdata/telegraf"
|
2019-08-29 05:34:44 +08:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
const (
|
2024-05-11 05:43:43 +08:00
|
|
|
eidInfo = 1
|
|
|
|
|
eidWarning = 2
|
|
|
|
|
eidError = 3
|
2019-08-29 05:34:44 +08:00
|
|
|
)
|
|
|
|
|
|
2024-06-25 21:48:56 +08:00
|
|
|
type eventLogger struct {
|
|
|
|
|
eventlog *eventlog.Log
|
2024-07-26 23:09:21 +08:00
|
|
|
errlog *log.Logger
|
2019-08-29 05:34:44 +08:00
|
|
|
}
|
|
|
|
|
|
2024-07-26 23:09:21 +08:00
|
|
|
func (l *eventLogger) Close() error {
|
2025-02-25 00:05:29 +08:00
|
|
|
if l.eventlog == nil {
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
if err := l.eventlog.Close(); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
l.eventlog = nil
|
|
|
|
|
return nil
|
2024-06-25 21:48:56 +08:00
|
|
|
}
|
|
|
|
|
|
2024-09-07 04:52:22 +08:00
|
|
|
func (l *eventLogger) Print(level telegraf.LogLevel, _ time.Time, prefix string, _ map[string]interface{}, args ...interface{}) {
|
2024-07-26 23:09:21 +08:00
|
|
|
// Skip debug and beyond as they cannot be logged
|
|
|
|
|
if level >= telegraf.Debug {
|
2024-06-25 21:48:56 +08:00
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
2025-02-25 00:05:29 +08:00
|
|
|
msg := prefix + fmt.Sprint(args...)
|
2024-05-11 05:43:43 +08:00
|
|
|
|
2024-07-26 23:09:21 +08:00
|
|
|
var err error
|
|
|
|
|
switch level {
|
|
|
|
|
case telegraf.Error:
|
|
|
|
|
err = l.eventlog.Error(eidError, msg)
|
|
|
|
|
case telegraf.Warn:
|
|
|
|
|
err = l.eventlog.Warning(eidWarning, msg)
|
|
|
|
|
case telegraf.Info:
|
|
|
|
|
err = l.eventlog.Info(eidInfo, msg)
|
2024-06-25 21:48:56 +08:00
|
|
|
}
|
2024-07-26 23:09:21 +08:00
|
|
|
if err != nil {
|
|
|
|
|
l.errlog.Printf("E! Writing log message failed: %v", err)
|
2021-01-20 00:03:19 +08:00
|
|
|
}
|
2024-09-07 04:52:22 +08:00
|
|
|
|
|
|
|
|
// TODO attributes...
|
2024-05-11 05:43:43 +08:00
|
|
|
}
|
2021-01-20 00:03:19 +08:00
|
|
|
|
2024-07-26 23:09:21 +08:00
|
|
|
func createEventLogger(cfg *Config) (sink, error) {
|
2024-06-25 21:48:56 +08:00
|
|
|
eventLog, err := eventlog.Open(cfg.InstanceName)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
l := &eventLogger{
|
|
|
|
|
eventlog: eventLog,
|
2024-07-26 23:09:21 +08:00
|
|
|
errlog: log.New(os.Stderr, "", 0),
|
2024-06-25 21:48:56 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return l, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func init() {
|
|
|
|
|
add("eventlog", createEventLogger)
|
2019-08-29 05:34:44 +08:00
|
|
|
}
|