mirror of https://github.com/containers/podman.git
Log all output of logrus to syslog as well as stdout/stderr
Signed-off-by: Daniel J Walsh <dwalsh@redhat.com> Closes: #1084 Approved by: baude
This commit is contained in:
parent
4f188aa191
commit
e615b7d671
|
@ -14,7 +14,9 @@ import (
|
||||||
"github.com/projectatomic/libpod/pkg/rootless"
|
"github.com/projectatomic/libpod/pkg/rootless"
|
||||||
"github.com/projectatomic/libpod/version"
|
"github.com/projectatomic/libpod/version"
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
|
lsyslog "github.com/sirupsen/logrus/hooks/syslog"
|
||||||
"github.com/urfave/cli"
|
"github.com/urfave/cli"
|
||||||
|
"log/syslog"
|
||||||
)
|
)
|
||||||
|
|
||||||
// This is populated by the Makefile from the VERSION file
|
// This is populated by the Makefile from the VERSION file
|
||||||
|
@ -94,6 +96,12 @@ func main() {
|
||||||
}
|
}
|
||||||
|
|
||||||
app.Before = func(c *cli.Context) error {
|
app.Before = func(c *cli.Context) error {
|
||||||
|
if c.GlobalBool("syslog") {
|
||||||
|
hook, err := lsyslog.NewSyslogHook("", "", syslog.LOG_INFO, "")
|
||||||
|
if err == nil {
|
||||||
|
logrus.AddHook(hook)
|
||||||
|
}
|
||||||
|
}
|
||||||
logLevel := c.GlobalString("log-level")
|
logLevel := c.GlobalString("log-level")
|
||||||
if logLevel != "" {
|
if logLevel != "" {
|
||||||
level, err := logrus.ParseLevel(logLevel)
|
level, err := logrus.ParseLevel(logLevel)
|
||||||
|
@ -187,6 +195,10 @@ func main() {
|
||||||
Name: "storage-opt",
|
Name: "storage-opt",
|
||||||
Usage: "used to pass an option to the storage driver",
|
Usage: "used to pass an option to the storage driver",
|
||||||
},
|
},
|
||||||
|
cli.BoolFlag{
|
||||||
|
Name: "syslog",
|
||||||
|
Usage: "output logging information to syslog as well as the console",
|
||||||
|
},
|
||||||
}
|
}
|
||||||
if _, err := os.Stat("/etc/containers/registries.conf"); err != nil {
|
if _, err := os.Stat("/etc/containers/registries.conf"); err != nil {
|
||||||
if os.IsNotExist(err) {
|
if os.IsNotExist(err) {
|
||||||
|
|
|
@ -2026,6 +2026,7 @@ _podman_podman() {
|
||||||
local boolean_options="
|
local boolean_options="
|
||||||
--help -h
|
--help -h
|
||||||
--version -v
|
--version -v
|
||||||
|
--syslog
|
||||||
"
|
"
|
||||||
commands="
|
commands="
|
||||||
attach
|
attach
|
||||||
|
|
|
@ -59,6 +59,10 @@ Select which storage driver is used to manage storage of images and containers (
|
||||||
|
|
||||||
Used to pass an option to the storage driver
|
Used to pass an option to the storage driver
|
||||||
|
|
||||||
|
**--syslog**
|
||||||
|
|
||||||
|
output logging information to syslog as well as the console
|
||||||
|
|
||||||
**--version, -v**
|
**--version, -v**
|
||||||
|
|
||||||
Print the version
|
Print the version
|
||||||
|
|
|
@ -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"
|
||||||
|
logrus_syslog "github.com/sirupsen/logrus/hooks/syslog"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
log := logrus.New()
|
||||||
|
hook, err := logrus_syslog.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"
|
||||||
|
logrus_syslog "github.com/sirupsen/logrus/hooks/syslog"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
log := logrus.New()
|
||||||
|
hook, err := logrus_syslog.NewSyslogHook("", "", syslog.LOG_INFO, "")
|
||||||
|
|
||||||
|
if err == nil {
|
||||||
|
log.Hooks.Add(hook)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
|
@ -0,0 +1,54 @@
|
||||||
|
// +build !windows,!nacl,!plan9
|
||||||
|
|
||||||
|
package logrus_syslog
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/sirupsen/logrus"
|
||||||
|
"log/syslog"
|
||||||
|
"os"
|
||||||
|
)
|
||||||
|
|
||||||
|
// 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:
|
||||||
|
return hook.Writer.Debug(line)
|
||||||
|
default:
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (hook *SyslogHook) Levels() []logrus.Level {
|
||||||
|
return logrus.AllLevels
|
||||||
|
}
|
Loading…
Reference in New Issue