Add syslog notifier
This commit is contained in:
parent
23a54e1ceb
commit
85207e0a77
5 changed files with 97 additions and 0 deletions
|
@ -28,6 +28,8 @@ type Config struct {
|
||||||
ActiveTimeout float64 `yaml:"active-timeout"`
|
ActiveTimeout float64 `yaml:"active-timeout"`
|
||||||
LogFile string `yaml:"log-file"`
|
LogFile string `yaml:"log-file"`
|
||||||
PidFile string `yaml:"pid-file"`
|
PidFile string `yaml:"pid-file"`
|
||||||
|
SyslogIdent string `yaml:"syslog-ident"`
|
||||||
|
SyslogFacility string `yaml:"syslog-facility"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
|
|
@ -10,6 +10,7 @@ import (
|
||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
"os/signal"
|
"os/signal"
|
||||||
|
"regexp"
|
||||||
"strconv"
|
"strconv"
|
||||||
"sync"
|
"sync"
|
||||||
"syscall"
|
"syscall"
|
||||||
|
@ -36,6 +37,8 @@ func main() {
|
||||||
flag.Float64Var(&config.ActiveTimeout, "active-timeout", 0, "Time for active connections to be terminated in seconds")
|
flag.Float64Var(&config.ActiveTimeout, "active-timeout", 0, "Time for active connections to be terminated in seconds")
|
||||||
flag.StringVar(&config.LogFile, "log-file", "", "Write logs to a file")
|
flag.StringVar(&config.LogFile, "log-file", "", "Write logs to a file")
|
||||||
flag.StringVar(&config.PidFile, "pid-file", "", "Write process id into a file")
|
flag.StringVar(&config.PidFile, "pid-file", "", "Write process id into a file")
|
||||||
|
flag.StringVar(&config.SyslogIdent, "syslog-ident", "pgterminate", "Define syslog tag")
|
||||||
|
flag.StringVar(&config.SyslogFacility, "syslog-facility", "", "Define syslog facility from LOCAL0 to LOCAL7")
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
|
|
||||||
if *version {
|
if *version {
|
||||||
|
@ -63,6 +66,14 @@ func main() {
|
||||||
log.Fatalln("Parameter -active-timeout or -idle-timeout required")
|
log.Fatalln("Parameter -active-timeout or -idle-timeout required")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if config.SyslogFacility != "" {
|
||||||
|
matched, err := regexp.MatchString("^LOCAL[0-7]$", config.SyslogFacility)
|
||||||
|
base.Panic(err)
|
||||||
|
if !matched {
|
||||||
|
log.Fatalln("Syslog facility must range from LOCAL0 to LOCAL7")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if config.PidFile != "" {
|
if config.PidFile != "" {
|
||||||
writePid(config.PidFile)
|
writePid(config.PidFile)
|
||||||
defer removePid(config.PidFile)
|
defer removePid(config.PidFile)
|
||||||
|
|
|
@ -9,3 +9,5 @@ idle-timeout: 300
|
||||||
active-timeout: 10
|
active-timeout: 10
|
||||||
log-file: /var/log/pgterminate/pgterminate.log
|
log-file: /var/log/pgterminate/pgterminate.log
|
||||||
pid-file: /var/run/pgterminate/pgterminate.pid
|
pid-file: /var/run/pgterminate/pgterminate.pid
|
||||||
|
#syslog-ident: pgterminate
|
||||||
|
#syslog-facility: LOCAL0
|
||||||
|
|
|
@ -16,5 +16,8 @@ func NewNotifier(ctx *base.Context) Notifier {
|
||||||
if ctx.Config.LogFile != "" {
|
if ctx.Config.LogFile != "" {
|
||||||
return NewFile(ctx.Config.LogFile, ctx.Sessions)
|
return NewFile(ctx.Config.LogFile, ctx.Sessions)
|
||||||
}
|
}
|
||||||
|
if ctx.Config.SyslogFacility != "" {
|
||||||
|
return NewSyslog(ctx.Config.SyslogFacility, ctx.Config.SyslogIdent, ctx.Sessions)
|
||||||
|
}
|
||||||
return NewConsole(ctx.Sessions)
|
return NewConsole(ctx.Sessions)
|
||||||
}
|
}
|
||||||
|
|
79
notifier/syslog.go
Normal file
79
notifier/syslog.go
Normal file
|
@ -0,0 +1,79 @@
|
||||||
|
package notifier
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/jouir/pgterminate/base"
|
||||||
|
"log/syslog"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Syslog notifier
|
||||||
|
type Syslog struct {
|
||||||
|
sessions chan base.Session
|
||||||
|
ident string
|
||||||
|
priority syslog.Priority
|
||||||
|
writer *syslog.Writer
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewSyslog creates a syslog notifier
|
||||||
|
func NewSyslog(facility string, ident string, sessions chan base.Session) Notifier {
|
||||||
|
var priority syslog.Priority
|
||||||
|
switch facility {
|
||||||
|
case "LOCAL0":
|
||||||
|
priority = syslog.LOG_INFO | syslog.LOG_LOCAL0
|
||||||
|
case "LOCAL1":
|
||||||
|
priority = syslog.LOG_INFO | syslog.LOG_LOCAL1
|
||||||
|
case "LOCAL2":
|
||||||
|
priority = syslog.LOG_INFO | syslog.LOG_LOCAL2
|
||||||
|
case "LOCAL3":
|
||||||
|
priority = syslog.LOG_INFO | syslog.LOG_LOCAL3
|
||||||
|
case "LOCAL4":
|
||||||
|
priority = syslog.LOG_INFO | syslog.LOG_LOCAL4
|
||||||
|
case "LOCAL5":
|
||||||
|
priority = syslog.LOG_INFO | syslog.LOG_LOCAL5
|
||||||
|
case "LOCAL6":
|
||||||
|
priority = syslog.LOG_INFO | syslog.LOG_LOCAL6
|
||||||
|
default: // LOCAL7
|
||||||
|
priority = syslog.LOG_INFO | syslog.LOG_LOCAL7
|
||||||
|
}
|
||||||
|
return &Syslog{
|
||||||
|
sessions: sessions,
|
||||||
|
ident: ident,
|
||||||
|
priority: priority,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Run starts syslog notifier
|
||||||
|
func (s *Syslog) Run() {
|
||||||
|
var err error
|
||||||
|
if s.writer, err = syslog.New(s.priority, s.ident); err != nil {
|
||||||
|
base.Panic(err)
|
||||||
|
}
|
||||||
|
for session := range s.sessions {
|
||||||
|
s.writer.Info(fmt.Sprintf("%s", session))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reload disconnect from syslog daemon and re-connect
|
||||||
|
// Executed when receiving SIGHUP signal
|
||||||
|
func (s *Syslog) Reload() {
|
||||||
|
if s.writer != nil {
|
||||||
|
s.disconnect()
|
||||||
|
s.connect()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// connect to syslog daemon
|
||||||
|
func (s *Syslog) connect() {
|
||||||
|
var err error
|
||||||
|
if s.writer, err = syslog.New(s.priority, s.ident); err != nil {
|
||||||
|
base.Panic(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// disconnect from syslog daemon
|
||||||
|
func (s *Syslog) disconnect() {
|
||||||
|
var err error
|
||||||
|
if err = s.writer.Close(); err != nil {
|
||||||
|
base.Panic(err)
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue