composer: add support for logrus syslog hook

Which will be used on crc in the log forwarding setup
NeededBy: COMPOSER-1285
This commit is contained in:
Diaa Sami 2022-04-28 16:03:24 +02:00 committed by Diaa Sami
parent 631133eabb
commit 33711d7d51
5 changed files with 111 additions and 5 deletions

View file

@ -14,6 +14,7 @@ type ComposerConfigFile struct {
Koji KojiAPIConfig `toml:"koji"`
Worker WorkerAPIConfig `toml:"worker"`
WeldrAPI WeldrAPIConfig `toml:"weldr_api"`
SyslogServer string `toml:"syslog_server" env:"SYSLOG_SERVER"`
LogLevel string `toml:"log_level"`
LogFormat string `toml:"log_format"`
}

View file

@ -6,6 +6,7 @@ import (
"github.com/coreos/go-systemd/activation"
"github.com/sirupsen/logrus"
"github.com/sirupsen/logrus/hooks/syslog"
)
const (
@ -69,6 +70,15 @@ func main() {
logrus.Fatal("CACHE_DIRECTORY is not set. Is the service file missing CacheDirectory=?")
}
if len(config.SyslogServer) > 0 {
hook, err := syslog.NewSyslogHook("tcp", config.SyslogServer, 0, "osbuild-composer")
if err != nil {
logrus.Fatal("Error connecting to syslog: " + err.Error())
}
logrus.AddHook(hook)
}
composer, err := NewComposer(config, stateDir, cacheDir)
if err != nil {
logrus.Fatalf("%v", err)

View file

@ -0,0 +1,39 @@
# Syslog Hooks for Logrus <img src="http://i.imgur.com/hTeVwmJ.png" width="40" height="40" alt=":walrus:" class="emoji" title=":walrus:"/>
## Usage
```go
import (
"log/syslog"
"github.com/sirupsen/logrus"
lSyslog "github.com/sirupsen/logrus/hooks/syslog"
)
func main() {
log := logrus.New()
hook, err := lSyslog.NewSyslogHook("udp", "localhost:514", syslog.LOG_INFO, "")
if err == nil {
log.Hooks.Add(hook)
}
}
```
If you want to connect to local syslog (Ex. "/dev/log" or "/var/run/syslog" or "/var/run/log"). Just assign empty string to the first two parameters of `NewSyslogHook`. It should look like the following.
```go
import (
"log/syslog"
"github.com/sirupsen/logrus"
lSyslog "github.com/sirupsen/logrus/hooks/syslog"
)
func main() {
log := logrus.New()
hook, err := lSyslog.NewSyslogHook("", "", syslog.LOG_INFO, "")
if err == nil {
log.Hooks.Add(hook)
}
}
```

View file

@ -0,0 +1,55 @@
// +build !windows,!nacl,!plan9
package syslog
import (
"fmt"
"log/syslog"
"os"
"github.com/sirupsen/logrus"
)
// SyslogHook to send logs via syslog.
type SyslogHook struct {
Writer *syslog.Writer
SyslogNetwork string
SyslogRaddr string
}
// Creates a hook to be added to an instance of logger. This is called with
// `hook, err := NewSyslogHook("udp", "localhost:514", syslog.LOG_DEBUG, "")`
// `if err == nil { log.Hooks.Add(hook) }`
func NewSyslogHook(network, raddr string, priority syslog.Priority, tag string) (*SyslogHook, error) {
w, err := syslog.Dial(network, raddr, priority, tag)
return &SyslogHook{w, network, raddr}, err
}
func (hook *SyslogHook) Fire(entry *logrus.Entry) error {
line, err := entry.String()
if err != nil {
fmt.Fprintf(os.Stderr, "Unable to read entry, %v", err)
return err
}
switch entry.Level {
case logrus.PanicLevel:
return hook.Writer.Crit(line)
case logrus.FatalLevel:
return hook.Writer.Crit(line)
case logrus.ErrorLevel:
return hook.Writer.Err(line)
case logrus.WarnLevel:
return hook.Writer.Warning(line)
case logrus.InfoLevel:
return hook.Writer.Info(line)
case logrus.DebugLevel, logrus.TraceLevel:
return hook.Writer.Debug(line)
default:
return nil
}
}
func (hook *SyslogHook) Levels() []logrus.Level {
return logrus.AllLevels
}

1
vendor/modules.txt vendored
View file

@ -338,6 +338,7 @@ github.com/segmentio/ksuid
# github.com/sirupsen/logrus v1.8.1
## explicit
github.com/sirupsen/logrus
github.com/sirupsen/logrus/hooks/syslog
# github.com/sony/gobreaker v0.4.2-0.20210216022020-dd874f9dd33b
github.com/sony/gobreaker
# github.com/spf13/cobra v1.4.0