syslog.go 1.7 KB

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