syslog.go 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. //+build !windows,!nacl,!plan9
  2. package log
  3. import (
  4. "errors"
  5. "log/syslog"
  6. "github.com/inconshreveable/log15"
  7. )
  8. type SysLogHandler struct {
  9. syslog *syslog.Writer
  10. Network string
  11. Address string
  12. Facility string
  13. Tag string
  14. Format log15.Format
  15. }
  16. func NewSyslog() *SysLogHandler {
  17. return &SysLogHandler{
  18. Format: log15.LogfmtFormat(),
  19. }
  20. }
  21. func (sw *SysLogHandler) Init() error {
  22. prio, err := parseFacility(sw.Facility)
  23. if err != nil {
  24. return err
  25. }
  26. w, err := syslog.Dial(sw.Network, sw.Address, prio, sw.Tag)
  27. if err != nil {
  28. return err
  29. }
  30. sw.syslog = w
  31. return nil
  32. }
  33. func (sw *SysLogHandler) Log(r *log15.Record) error {
  34. var err error
  35. msg := string(sw.Format.Format(r))
  36. switch r.Lvl {
  37. case log15.LvlDebug:
  38. err = sw.syslog.Debug(msg)
  39. case log15.LvlInfo:
  40. err = sw.syslog.Info(msg)
  41. case log15.LvlWarn:
  42. err = sw.syslog.Warning(msg)
  43. case log15.LvlError:
  44. err = sw.syslog.Err(msg)
  45. case log15.LvlCrit:
  46. err = sw.syslog.Crit(msg)
  47. default:
  48. err = errors.New("invalid syslog level")
  49. }
  50. return err
  51. }
  52. func (sw *SysLogHandler) Close() {
  53. sw.syslog.Close()
  54. }
  55. var facilities = map[string]syslog.Priority{
  56. "user": syslog.LOG_USER,
  57. "daemon": syslog.LOG_DAEMON,
  58. "local0": syslog.LOG_LOCAL0,
  59. "local1": syslog.LOG_LOCAL1,
  60. "local2": syslog.LOG_LOCAL2,
  61. "local3": syslog.LOG_LOCAL3,
  62. "local4": syslog.LOG_LOCAL4,
  63. "local5": syslog.LOG_LOCAL5,
  64. "local6": syslog.LOG_LOCAL6,
  65. "local7": syslog.LOG_LOCAL7,
  66. }
  67. func parseFacility(facility string) (syslog.Priority, error) {
  68. prio, ok := facilities[facility]
  69. if !ok {
  70. return syslog.LOG_LOCAL0, errors.New("invalid syslog facility")
  71. }
  72. return prio, nil
  73. }