syslog.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. package main
  2. import (
  3. "fmt"
  4. "log/syslog"
  5. "os"
  6. "github.com/sirupsen/logrus"
  7. )
  8. var (
  9. syslogLevels = map[string]logrus.Level{
  10. "crit": logrus.FatalLevel,
  11. "error": logrus.ErrorLevel,
  12. "warning": logrus.WarnLevel,
  13. "info": logrus.InfoLevel,
  14. }
  15. )
  16. type syslogHook struct {
  17. writer *syslog.Writer
  18. levels []logrus.Level
  19. formatter logrus.Formatter
  20. }
  21. func isSyslogEnabled() (enabled bool) {
  22. boolEnvConfig(&enabled, "IMGPROXY_SYSLOG_ENABLE")
  23. return
  24. }
  25. func newSyslogHook() (*syslogHook, error) {
  26. var (
  27. network, addr string
  28. level logrus.Level
  29. tag = "imgproxy"
  30. levelStr = "notice"
  31. )
  32. strEnvConfig(&network, "IMGPROXY_SYSLOG_NETWORK")
  33. strEnvConfig(&addr, "IMGPROXY_SYSLOG_ADDRESS")
  34. strEnvConfig(&tag, "IMGPROXY_SYSLOG_TAG")
  35. strEnvConfig(&levelStr, "IMGPROXY_SYSLOG_LEVEL")
  36. if l, ok := syslogLevels[levelStr]; ok {
  37. level = l
  38. } else {
  39. level = logrus.InfoLevel
  40. logWarning("Syslog level '%s' is invalid, 'info' is used", levelStr)
  41. }
  42. w, err := syslog.Dial(network, addr, syslog.LOG_NOTICE, tag)
  43. return &syslogHook{
  44. writer: w,
  45. levels: logrus.AllLevels[:int(level)+1],
  46. formatter: &logStructuredFormatter{},
  47. }, err
  48. }
  49. func (hook *syslogHook) Fire(entry *logrus.Entry) error {
  50. line, err := hook.formatter.Format(entry)
  51. if err != nil {
  52. fmt.Fprintf(os.Stderr, "Unable to read entry, %v\n", err)
  53. return err
  54. }
  55. switch entry.Level {
  56. case logrus.PanicLevel, logrus.FatalLevel:
  57. return hook.writer.Crit(string(line))
  58. case logrus.ErrorLevel:
  59. return hook.writer.Err(string(line))
  60. case logrus.WarnLevel:
  61. return hook.writer.Warning(string(line))
  62. case logrus.InfoLevel:
  63. return hook.writer.Info(string(line))
  64. default:
  65. return nil
  66. }
  67. }
  68. func (hook *syslogHook) Levels() []logrus.Level {
  69. return hook.levels
  70. }