mirror of
https://github.com/Luzifer/elastic_cron.git
synced 2024-12-23 02:41:20 +00:00
Allow log format to be configured
Signed-off-by: Knut Ahlers <knut@ahlers.me>
This commit is contained in:
parent
2809935b64
commit
eb7c01ab2f
2 changed files with 40 additions and 13 deletions
7
main.go
7
main.go
|
@ -27,6 +27,7 @@ var (
|
||||||
|
|
||||||
type cronConfig struct {
|
type cronConfig struct {
|
||||||
RSyslogTarget string `yaml:"rsyslog_target"`
|
RSyslogTarget string `yaml:"rsyslog_target"`
|
||||||
|
LogTemplate string `yaml:"log_template"`
|
||||||
Jobs []cronJob `yaml:"jobs"`
|
Jobs []cronJob `yaml:"jobs"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -52,7 +53,9 @@ func main() {
|
||||||
log.Fatalf("Unable to read config file: %s")
|
log.Fatalf("Unable to read config file: %s")
|
||||||
}
|
}
|
||||||
|
|
||||||
cc := cronConfig{}
|
cc := cronConfig{
|
||||||
|
LogTemplate: `<{{ syslogpri .Severity }}>{{ .Date.Format "Jan 02 15:04:05" }} {{ .Hostname }} {{ .JobName }}: {{ .Message }}`,
|
||||||
|
}
|
||||||
if err := yaml.Unmarshal(body, &cc); err != nil {
|
if err := yaml.Unmarshal(body, &cc); err != nil {
|
||||||
log.Fatalf("Unable to parse config file: %s", err)
|
log.Fatalf("Unable to parse config file: %s", err)
|
||||||
}
|
}
|
||||||
|
@ -68,7 +71,7 @@ func main() {
|
||||||
|
|
||||||
c.Start()
|
c.Start()
|
||||||
|
|
||||||
logadapter, err := NewSyslogAdapter(cc.RSyslogTarget)
|
logadapter, err := NewSyslogAdapter(cc.RSyslogTarget, cc.LogTemplate)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("Unable to open syslog connection: %s", err)
|
log.Fatalf("Unable to open syslog connection: %s", err)
|
||||||
}
|
}
|
||||||
|
|
40
syslog.go
40
syslog.go
|
@ -5,6 +5,7 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"net"
|
"net"
|
||||||
|
"text/template"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/cenkalti/backoff"
|
"github.com/cenkalti/backoff"
|
||||||
|
@ -15,9 +16,10 @@ const (
|
||||||
tcpDialTimeout = 5 * time.Second
|
tcpDialTimeout = 5 * time.Second
|
||||||
)
|
)
|
||||||
|
|
||||||
func NewSyslogAdapter(address string) (*SyslogAdapter, error) {
|
func NewSyslogAdapter(address, logFormat string) (*SyslogAdapter, error) {
|
||||||
return &SyslogAdapter{
|
return &SyslogAdapter{
|
||||||
address: address,
|
address: address,
|
||||||
|
logFormat: logFormat,
|
||||||
dialer: &net.Dialer{
|
dialer: &net.Dialer{
|
||||||
Timeout: tcpDialTimeout,
|
Timeout: tcpDialTimeout,
|
||||||
},
|
},
|
||||||
|
@ -33,9 +35,33 @@ type message struct {
|
||||||
|
|
||||||
type SyslogAdapter struct {
|
type SyslogAdapter struct {
|
||||||
address string
|
address string
|
||||||
|
logFormat string
|
||||||
dialer *net.Dialer
|
dialer *net.Dialer
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (a *SyslogAdapter) formatMessage(m *message) (string, error) {
|
||||||
|
t, err := template.New("logFormat").Funcs(template.FuncMap{
|
||||||
|
"syslogpri": func(pri int) int { return 16*8 + pri },
|
||||||
|
}).Parse(a.logFormat)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
buf := bytes.NewBufferString("")
|
||||||
|
if err := t.Execute(buf, map[string]interface{}{
|
||||||
|
"Date": m.Date,
|
||||||
|
"JobName": m.JobName,
|
||||||
|
"Hostname": cfg.Hostname,
|
||||||
|
"Message": m.Message,
|
||||||
|
"Severity": m.Severity,
|
||||||
|
}); err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
return buf.String(), nil
|
||||||
|
}
|
||||||
|
|
||||||
func (a *SyslogAdapter) Stream(logstream chan *message) {
|
func (a *SyslogAdapter) Stream(logstream chan *message) {
|
||||||
backoff.Retry(func() error {
|
backoff.Retry(func() error {
|
||||||
conn, err := a.dialer.Dial("tcp", a.address)
|
conn, err := a.dialer.Dial("tcp", a.address)
|
||||||
|
@ -49,13 +75,11 @@ func (a *SyslogAdapter) Stream(logstream chan *message) {
|
||||||
for msg := range logstream {
|
for msg := range logstream {
|
||||||
b.Reset()
|
b.Reset()
|
||||||
|
|
||||||
fmt.Fprintf(b, "<%d>%s %s %s: %s\n",
|
msgLine, err := a.formatMessage(msg)
|
||||||
16*8+msg.Severity,
|
if err != nil {
|
||||||
msg.Date.Format("Jan 02 15:04:05"),
|
return err
|
||||||
cfg.Hostname,
|
}
|
||||||
msg.JobName,
|
fmt.Fprintln(b, msgLine)
|
||||||
msg.Message,
|
|
||||||
)
|
|
||||||
|
|
||||||
if err := conn.SetDeadline(time.Now().Add(readWriteTimeout)); err != nil {
|
if err := conn.SetDeadline(time.Now().Add(readWriteTimeout)); err != nil {
|
||||||
fmt.Printf("syslog: Unable to set deadline: %s\n", err)
|
fmt.Printf("syslog: Unable to set deadline: %s\n", err)
|
||||||
|
|
Loading…
Reference in a new issue