logs_windows.go 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. package main
  2. import (
  3. "fmt"
  4. "io/ioutil"
  5. "os"
  6. "github.com/kardianos/service"
  7. "github.com/sirupsen/logrus"
  8. )
  9. // HookLogger routes the logrus logs through the service logger so that they end up in the Windows Event Viewer
  10. // logrus output will be discarded
  11. func HookLogger(l *logrus.Logger) {
  12. l.AddHook(newLogHook(logger))
  13. l.SetOutput(ioutil.Discard)
  14. }
  15. type logHook struct {
  16. sl service.Logger
  17. }
  18. func newLogHook(sl service.Logger) *logHook {
  19. return &logHook{sl: sl}
  20. }
  21. func (h *logHook) Fire(entry *logrus.Entry) error {
  22. line, err := entry.String()
  23. if err != nil {
  24. fmt.Fprintf(os.Stderr, "Unable to read entry, %v", err)
  25. return err
  26. }
  27. switch entry.Level {
  28. case logrus.PanicLevel:
  29. return h.sl.Error(line)
  30. case logrus.FatalLevel:
  31. return h.sl.Error(line)
  32. case logrus.ErrorLevel:
  33. return h.sl.Error(line)
  34. case logrus.WarnLevel:
  35. return h.sl.Warning(line)
  36. case logrus.InfoLevel:
  37. return h.sl.Info(line)
  38. case logrus.DebugLevel:
  39. return h.sl.Info(line)
  40. default:
  41. return nil
  42. }
  43. }
  44. func (h *logHook) Levels() []logrus.Level {
  45. return logrus.AllLevels
  46. }