pax_global_header00006660000000000000000000000064130116001660014504gustar00rootroot0000000000000052 comment=244f29bd260884993b176cd14ef2f7631f6f3c18 dexlogconfig-244f29bd260884993b176cd14ef2f7631f6f3c18/000077500000000000000000000000001301160016600207605ustar00rootroot00000000000000dexlogconfig-244f29bd260884993b176cd14ef2f7631f6f3c18/README.md000066400000000000000000000002701301160016600222360ustar00rootroot00000000000000# dexlogconfig This is a policy package to configure [xlog](https://github.com/hlandau/xlog) as I like it. It is used in my daemons, and provides an example of how to configure xlog. dexlogconfig-244f29bd260884993b176cd14ef2f7631f6f3c18/syslog_other.go000066400000000000000000000001251301160016600240260ustar00rootroot00000000000000// +build windows package dexlogconfig func openSyslog() {} func openJournal() {} dexlogconfig-244f29bd260884993b176cd14ef2f7631f6f3c18/syslogconfig.go000066400000000000000000000053661301160016600240270ustar00rootroot00000000000000// +build !windows package dexlogconfig import "github.com/hlandau/xlog" import "gopkg.in/hlandau/easyconfig.v1/cflag" import "log/syslog" import "strings" import "gopkg.in/hlandau/svcutils.v1/exepath" import "github.com/coreos/go-systemd/journal" import "fmt" var ( syslogFacilityFlag = cflag.String(flagGroup, "facility", "daemon", "Syslog facility to use") syslogFlag = cflag.Bool(flagGroup, "syslog", false, "Log to syslog?") syslogSeverityFlag = cflag.String(flagGroup, "syslogseverity", "DEBUG", "Syslog severity limit") journalFlag = cflag.Bool(flagGroup, "journal", false, "Log to systemd journal?") journalSeverityFlag = cflag.String(flagGroup, "journalseverity", "DEBUG", "Systemd journal severity limit") ) var facilities = map[string]syslog.Priority{ "kern": syslog.LOG_KERN, "user": syslog.LOG_USER, "mail": syslog.LOG_MAIL, "daemon": syslog.LOG_DAEMON, "auth": syslog.LOG_AUTH, "syslog": syslog.LOG_SYSLOG, "lpr": syslog.LOG_LPR, "news": syslog.LOG_NEWS, "uucp": syslog.LOG_UUCP, "cron": syslog.LOG_CRON, "authpriv": syslog.LOG_AUTHPRIV, "ftp": syslog.LOG_FTP, "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 openSyslog() { if !syslogFlag.Value() { return } syslogFacility := syslogFacilityFlag.Value() f, ok := facilities[strings.ToLower(syslogFacility)] if !ok { return } pn := exepath.ProgramName if pn == "" { pn = "unknown" } w, err := syslog.New(f|syslog.LOG_DEBUG, pn) if err != nil { return } sink := xlog.NewSyslogSink(w) if sev, ok := xlog.ParseSeverity(syslogSeverityFlag.Value()); ok { sink.SetSeverity(sev) } xlog.RootSink.Add(sink) } func openJournal() { if !journalFlag.Value() || !journal.Enabled() { return } jsink.Tags = map[string]string{ "SYSLOG_FACILITY": syslogFacilityFlag.Value(), } if exepath.ProgramName != "" { jsink.Tags["SYSLOG_TAG"] = exepath.ProgramName } if sev, ok := xlog.ParseSeverity(journalSeverityFlag.Value()); ok { jsink.MinSeverity = sev } xlog.RootSink.Add(&jsink) } type journalSink struct { Tags map[string]string MinSeverity xlog.Severity } func (s *journalSink) ReceiveLocally(sev xlog.Severity, format string, params ...interface{}) { s.ReceiveFromChild(sev, format, params...) } func (s *journalSink) ReceiveFromChild(sev xlog.Severity, format string, params ...interface{}) { if sev > s.MinSeverity { return } journal.Send(fmt.Sprintf(format, params...), journal.Priority(sev.Syslog()), s.Tags) // ignore errors } var jsink = journalSink{ MinSeverity: xlog.SevDebug, } dexlogconfig-244f29bd260884993b176cd14ef2f7631f6f3c18/xlogconfig.go000066400000000000000000000033261301160016600234520ustar00rootroot00000000000000// Package dexlogconfig is a policy package to configure xlog as I like it. package dexlogconfig import "github.com/hlandau/xlog" import "gopkg.in/hlandau/easyconfig.v1/cflag" import "os" import _ "github.com/hlandau/buildinfo" import "gopkg.in/hlandau/svcutils.v1/systemd" var ( flagGroup = cflag.NewGroup(nil, "xlog") logSeverityFlag = cflag.String(flagGroup, "severity", "NOTICE", "Log severity (any syslog severity name or number)") logFileFlag = cflag.String(flagGroup, "file", "", "Log to filename") fileSeverityFlag = cflag.String(flagGroup, "fileseverity", "TRACE", "File logging severity limit") logStderrFlag = cflag.Bool(flagGroup, "stderr", true, "Log to stderr?") stderrSeverityFlag = cflag.String(flagGroup, "stderrseverity", "TRACE", "stderr logging severity limit") ) func openStderr() { if logStderrFlag.Value() { if sev, ok := xlog.ParseSeverity(stderrSeverityFlag.Value()); ok { xlog.StderrSink.SetSeverity(sev) } if systemd.IsRunningUnder() { xlog.StderrSink.Systemd = true } return } xlog.RootSink.Remove(xlog.StderrSink) } func openFile() { fn := logFileFlag.Value() if fn == "" { return } f, err := os.Create(fn) if err != nil { return } sink := xlog.NewWriterSink(f) if sev, ok := xlog.ParseSeverity(fileSeverityFlag.Value()); ok { sink.SetSeverity(sev) } xlog.RootSink.Add(sink) } func setSeverity() { sevs := logSeverityFlag.Value() sev, ok := xlog.ParseSeverity(sevs) if !ok { return } xlog.Root.SetSeverity(sev) xlog.VisitSites(func(s xlog.Site) error { s.SetSeverity(sev) return nil }) } // Parse registered configurables and setup logging. func Init() { setSeverity() openStderr() openSyslog() openJournal() openFile() }