From 4b1e09f2b4a16a7c30b7b1cf21cb5161b83d9b06 Mon Sep 17 00:00:00 2001 From: Gyu-Ho Lee Date: Thu, 2 Nov 2017 12:49:18 -0700 Subject: [PATCH] embed: move SetupLogging, LogOutput from etcdmain Signed-off-by: Gyu-Ho Lee --- embed/config.go | 41 +++++++++++++++++++++++++++++++++++++++++ etcd.conf.yml.sample | 3 +++ 2 files changed, 44 insertions(+) diff --git a/embed/config.go b/embed/config.go index 2106db1e8..4177ae690 100644 --- a/embed/config.go +++ b/embed/config.go @@ -15,11 +15,13 @@ package embed import ( + "crypto/tls" "fmt" "io/ioutil" "net" "net/http" "net/url" + "os" "path/filepath" "strings" "time" @@ -31,6 +33,7 @@ import ( "github.com/coreos/etcd/pkg/transport" "github.com/coreos/etcd/pkg/types" + "github.com/coreos/pkg/capnslog" "github.com/ghodss/yaml" "google.golang.org/grpc" ) @@ -136,6 +139,7 @@ type Config struct { Debug bool `json:"debug"` LogPkgLevels string `json:"log-package-levels"` + LogOutput string `json:"log-output"` EnablePprof bool `json:"enable-pprof"` Metrics string `json:"metrics"` ListenMetricsUrls []url.URL @@ -228,6 +232,43 @@ func NewConfig() *Config { return cfg } +// SetupLogging initializes etcd logging. +// Must be called after flag parsing. +func (cfg *Config) SetupLogging() { + cfg.ClientTLSInfo.HandshakeFailure = func(conn *tls.Conn, err error) { + plog.Infof("rejected connection from %q (%v)", conn.RemoteAddr().String(), err) + } + cfg.PeerTLSInfo.HandshakeFailure = cfg.ClientTLSInfo.HandshakeFailure + + capnslog.SetGlobalLogLevel(capnslog.INFO) + if cfg.Debug { + capnslog.SetGlobalLogLevel(capnslog.DEBUG) + grpc.EnableTracing = true + } + if cfg.LogPkgLevels != "" { + repoLog := capnslog.MustRepoLogger("github.com/coreos/etcd") + settings, err := repoLog.ParseLogLevelConfig(cfg.LogPkgLevels) + if err != nil { + plog.Warningf("couldn't parse log level string: %s, continuing with default levels", err.Error()) + return + } + repoLog.SetLogLevel(settings) + } + + // capnslog initially SetFormatter(NewDefaultFormatter(os.Stderr)) + // where NewDefaultFormatter returns NewJournaldFormatter when syscall.Getppid() == 1 + // specify 'stdout' or 'stderr' to skip journald logging even when running under systemd + switch cfg.LogOutput { + case "stdout": + capnslog.SetFormatter(capnslog.NewPrettyFormatter(os.Stdout, cfg.Debug)) + case "stderr": + capnslog.SetFormatter(capnslog.NewPrettyFormatter(os.Stderr, cfg.Debug)) + case "default": + default: + plog.Panicf(`unknown log-output %q (only supports "default", "stdout", "stderr")`, cfg.LogOutput) + } +} + func ConfigFromFile(path string) (*Config, error) { cfg := &configYAML{Config: *NewConfig()} if err := cfg.configFromFile(path); err != nil { diff --git a/etcd.conf.yml.sample b/etcd.conf.yml.sample index 7759e5432..0178ed691 100644 --- a/etcd.conf.yml.sample +++ b/etcd.conf.yml.sample @@ -137,5 +137,8 @@ debug: false # Specify a particular log level for each etcd package (eg: 'etcdmain=CRITICAL,etcdserver=DEBUG'. log-package-levels: +# Specify 'stdout' or 'stderr' to skip journald logging even when running under systemd. +log-output: default + # Force to create a new one member cluster. force-new-cluster: false