syslog.go 2.0 KB

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