syslog.go 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. //go:build !windows && !plan9
  2. // +build !windows,!plan9
  3. package log
  4. import (
  5. "log/syslog"
  6. "strings"
  7. )
  8. // SyslogHandler opens a connection to the system syslog daemon by calling
  9. // syslog.New and writes all records to it.
  10. func SyslogHandler(priority syslog.Priority, tag string, fmtr Format) (Handler, error) {
  11. wr, err := syslog.New(priority, tag)
  12. return sharedSyslog(fmtr, wr, err)
  13. }
  14. // SyslogNetHandler opens a connection to a log daemon over the network and writes
  15. // all log records to it.
  16. func SyslogNetHandler(net, addr string, priority syslog.Priority, tag string, fmtr Format) (Handler, error) {
  17. wr, err := syslog.Dial(net, addr, priority, tag)
  18. return sharedSyslog(fmtr, wr, err)
  19. }
  20. func sharedSyslog(fmtr Format, sysWr *syslog.Writer, err error) (Handler, error) {
  21. if err != nil {
  22. return nil, err
  23. }
  24. h := FuncHandler(func(r *Record) error {
  25. var syslogFn = sysWr.Info
  26. switch r.Lvl {
  27. case LvlCrit:
  28. syslogFn = sysWr.Crit
  29. case LvlError:
  30. syslogFn = sysWr.Err
  31. case LvlWarn:
  32. syslogFn = sysWr.Warning
  33. case LvlInfo:
  34. syslogFn = sysWr.Info
  35. case LvlDebug:
  36. syslogFn = sysWr.Debug
  37. case LvlTrace:
  38. syslogFn = func(m string) error { return nil } // There's no syslog level for trace
  39. }
  40. s := strings.TrimSpace(string(fmtr.Format(r)))
  41. return syslogFn(s)
  42. })
  43. return LazyHandler(&closingHandler{sysWr, h}), nil
  44. }
  45. func (m muster) SyslogHandler(priority syslog.Priority, tag string, fmtr Format) Handler {
  46. return must(SyslogHandler(priority, tag, fmtr))
  47. }
  48. func (m muster) SyslogNetHandler(net, addr string, priority syslog.Priority, tag string, fmtr Format) Handler {
  49. return must(SyslogNetHandler(net, addr, priority, tag, fmtr))
  50. }