syslog.go 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. //+build !windows,!nacl,!plan9
  2. package log
  3. import (
  4. "encoding/json"
  5. "errors"
  6. "log/syslog"
  7. )
  8. type SyslogWriter struct {
  9. syslog *syslog.Writer
  10. Network string `json:"network"`
  11. Address string `json:"address"`
  12. Facility string `json:"facility"`
  13. Tag string `json:"tag"`
  14. }
  15. func NewSyslog() LoggerInterface {
  16. return new(SyslogWriter)
  17. }
  18. func (sw *SyslogWriter) Init(config string) error {
  19. if err := json.Unmarshal([]byte(config), sw); err != nil {
  20. return err
  21. }
  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 *SyslogWriter) WriteMsg(msg string, skip, level int) error {
  34. var err error
  35. switch level {
  36. case TRACE, DEBUG:
  37. err = sw.syslog.Debug(msg)
  38. case INFO:
  39. err = sw.syslog.Info(msg)
  40. case WARN:
  41. err = sw.syslog.Warning(msg)
  42. case ERROR:
  43. err = sw.syslog.Err(msg)
  44. case CRITICAL:
  45. err = sw.syslog.Crit(msg)
  46. case FATAL:
  47. err = sw.syslog.Alert(msg)
  48. default:
  49. err = errors.New("invalid syslog level")
  50. }
  51. return err
  52. }
  53. func (sw *SyslogWriter) Destroy() {
  54. sw.syslog.Close()
  55. }
  56. func (sw *SyslogWriter) Flush() {}
  57. var facilities = map[string]syslog.Priority{
  58. "user": syslog.LOG_USER,
  59. "daemon": syslog.LOG_DAEMON,
  60. "local0": syslog.LOG_LOCAL0,
  61. "local1": syslog.LOG_LOCAL1,
  62. "local2": syslog.LOG_LOCAL2,
  63. "local3": syslog.LOG_LOCAL3,
  64. "local4": syslog.LOG_LOCAL4,
  65. "local5": syslog.LOG_LOCAL5,
  66. "local6": syslog.LOG_LOCAL6,
  67. "local7": syslog.LOG_LOCAL7,
  68. }
  69. func parseFacility(facility string) (syslog.Priority, error) {
  70. prio, ok := facilities[facility]
  71. if !ok {
  72. return syslog.LOG_LOCAL0, errors.New("invalid syslog facility")
  73. }
  74. return prio, nil
  75. }
  76. func init() {
  77. Register("syslog", NewSyslog)
  78. }