syslog.go 1.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. package syslog
  2. import (
  3. "log/slog"
  4. "log/syslog"
  5. "time"
  6. )
  7. // Hook is a [logger.Hook] implementation for syslog.
  8. type Hook struct {
  9. writer *syslog.Writer
  10. level slog.Leveler
  11. }
  12. // NewHook creates a new syslog hook.
  13. // It returns nil if the syslog hook is not enabled in the config.
  14. func NewHook(config *Config) (*Hook, error) {
  15. if err := config.Validate(); err != nil {
  16. return nil, err
  17. }
  18. if !config.Enabled {
  19. return nil, nil
  20. }
  21. w, err := syslog.Dial(config.Network, config.Addr, syslog.LOG_INFO, config.Tag)
  22. if err != nil {
  23. return nil, err
  24. }
  25. return &Hook{
  26. writer: w,
  27. level: config.Level.Level(),
  28. }, nil
  29. }
  30. func (hook *Hook) Enabled(level slog.Level) bool {
  31. return level >= hook.level.Level()
  32. }
  33. func (hook *Hook) Fire(time time.Time, lvl slog.Level, msg []byte) error {
  34. msgStr := string(msg)
  35. switch {
  36. case lvl < slog.LevelInfo:
  37. return hook.writer.Debug(msgStr)
  38. case lvl < slog.LevelWarn:
  39. return hook.writer.Info(msgStr)
  40. case lvl < slog.LevelError:
  41. return hook.writer.Warning(msgStr)
  42. default:
  43. return hook.writer.Err(msgStr)
  44. }
  45. }