| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- //+build !windows,!nacl,!plan9
- package log
- import (
- "errors"
- "log/syslog"
- "os"
- "github.com/inconshreveable/log15"
- "gopkg.in/ini.v1"
- )
- type SysLogHandler struct {
- syslog *syslog.Writer
- Network string
- Address string
- Facility string
- Tag string
- Format log15.Format
- }
- func NewSyslog(sec *ini.Section, format log15.Format) *SysLogHandler {
- handler := &SysLogHandler{
- Format: log15.LogfmtFormat(),
- }
- handler.Format = format
- handler.Network = sec.Key("network").MustString("")
- handler.Address = sec.Key("address").MustString("")
- handler.Facility = sec.Key("facility").MustString("local7")
- handler.Tag = sec.Key("tag").MustString("")
- if err := handler.Init(); err != nil {
- Root.Error("Failed to init syslog log handler", "error", err)
- os.Exit(1)
- }
- return handler
- }
- func (sw *SysLogHandler) Init() error {
- prio, err := parseFacility(sw.Facility)
- if err != nil {
- return err
- }
- w, err := syslog.Dial(sw.Network, sw.Address, prio, sw.Tag)
- if err != nil {
- return err
- }
- sw.syslog = w
- return nil
- }
- func (sw *SysLogHandler) Log(r *log15.Record) error {
- var err error
- msg := string(sw.Format.Format(r))
- switch r.Lvl {
- case log15.LvlDebug:
- err = sw.syslog.Debug(msg)
- case log15.LvlInfo:
- err = sw.syslog.Info(msg)
- case log15.LvlWarn:
- err = sw.syslog.Warning(msg)
- case log15.LvlError:
- err = sw.syslog.Err(msg)
- case log15.LvlCrit:
- err = sw.syslog.Crit(msg)
- default:
- err = errors.New("invalid syslog level")
- }
- return err
- }
- func (sw *SysLogHandler) Close() {
- sw.syslog.Close()
- }
- var facilities = map[string]syslog.Priority{
- "user": syslog.LOG_USER,
- "daemon": syslog.LOG_DAEMON,
- "local0": syslog.LOG_LOCAL0,
- "local1": syslog.LOG_LOCAL1,
- "local2": syslog.LOG_LOCAL2,
- "local3": syslog.LOG_LOCAL3,
- "local4": syslog.LOG_LOCAL4,
- "local5": syslog.LOG_LOCAL5,
- "local6": syslog.LOG_LOCAL6,
- "local7": syslog.LOG_LOCAL7,
- }
- func parseFacility(facility string) (syslog.Priority, error) {
- prio, ok := facilities[facility]
- if !ok {
- return syslog.LOG_LOCAL0, errors.New("invalid syslog facility")
- }
- return prio, nil
- }
|