Configurable log level

This commit is contained in:
Robert Jacob 2020-06-21 15:39:24 +02:00
parent 87960917f6
commit 814c0344f1
3 changed files with 54 additions and 12 deletions

View file

@ -2,19 +2,23 @@ package main
import ( import (
"errors" "errors"
"fmt"
netatmo "github.com/exzz/netatmo-api-go" netatmo "github.com/exzz/netatmo-api-go"
"github.com/sirupsen/logrus"
"github.com/spf13/pflag" "github.com/spf13/pflag"
) )
const ( const (
envVarListenAddress = "NETATMO_EXPORTER_ADDR" envVarListenAddress = "NETATMO_EXPORTER_ADDR"
envVarLogLevel = "NETATMO_LOG_LEVEL"
envVarNetatmoClientID = "NETATMO_CLIENT_ID" envVarNetatmoClientID = "NETATMO_CLIENT_ID"
envVarNetatmoClientSecret = "NETATMO_CLIENT_SECRET" envVarNetatmoClientSecret = "NETATMO_CLIENT_SECRET"
envVarNetatmoUsername = "NETATMO_CLIENT_USERNAME" envVarNetatmoUsername = "NETATMO_CLIENT_USERNAME"
envVarNetatmoPassword = "NETATMO_CLIENT_PASSWORD" envVarNetatmoPassword = "NETATMO_CLIENT_PASSWORD"
flagListenAddress = "addr" flagListenAddress = "addr"
flagLogLevel = "log-level"
flagNetatmoClientID = "client-id" flagNetatmoClientID = "client-id"
flagNetatmoClientSecret = "client-secret" flagNetatmoClientSecret = "client-secret"
flagNetatmoUsername = "username" flagNetatmoUsername = "username"
@ -24,6 +28,7 @@ const (
var ( var (
defaultConfig = config{ defaultConfig = config{
Addr: ":9210", Addr: ":9210",
LogLevel: logLevel(logrus.InfoLevel),
} }
errNoBinaryName = errors.New("need the binary name as first argument") errNoBinaryName = errors.New("need the binary name as first argument")
@ -34,8 +39,29 @@ var (
errNoNetatmoPassword = errors.New("password can not be blank") errNoNetatmoPassword = errors.New("password can not be blank")
) )
type logLevel logrus.Level
func (l *logLevel) Type() string {
return "level"
}
func (l *logLevel) String() string {
return fmt.Sprintf("%s", logrus.Level(*l))
}
func (l *logLevel) Set(value string) error {
level, err := logrus.ParseLevel(value)
if err != nil {
return err
}
*l = logLevel(level)
return nil
}
type config struct { type config struct {
Addr string Addr string
LogLevel logLevel
Netatmo netatmo.Config Netatmo netatmo.Config
} }
@ -48,42 +74,51 @@ func parseConfig(args []string, getenv func(string) string) (config, error) {
flagSet := pflag.NewFlagSet(args[0], pflag.ExitOnError) flagSet := pflag.NewFlagSet(args[0], pflag.ExitOnError)
flagSet.StringVarP(&cfg.Addr, "addr", "a", cfg.Addr, "Address to listen on.") flagSet.StringVarP(&cfg.Addr, "addr", "a", cfg.Addr, "Address to listen on.")
flagSet.Var(&cfg.LogLevel, flagLogLevel, "Sets the minimum level output through logging.")
flagSet.StringVarP(&cfg.Netatmo.ClientID, "client-id", "i", cfg.Netatmo.ClientID, "Client ID for NetAtmo app.") flagSet.StringVarP(&cfg.Netatmo.ClientID, "client-id", "i", cfg.Netatmo.ClientID, "Client ID for NetAtmo app.")
flagSet.StringVarP(&cfg.Netatmo.ClientSecret, "client-secret", "s", cfg.Netatmo.ClientSecret, "Client secret for NetAtmo app.") flagSet.StringVarP(&cfg.Netatmo.ClientSecret, "client-secret", "s", cfg.Netatmo.ClientSecret, "Client secret for NetAtmo app.")
flagSet.StringVarP(&cfg.Netatmo.Username, "username", "u", cfg.Netatmo.Username, "Username of NetAtmo account.") flagSet.StringVarP(&cfg.Netatmo.Username, "username", "u", cfg.Netatmo.Username, "Username of NetAtmo account.")
flagSet.StringVarP(&cfg.Netatmo.Password, "password", "p", cfg.Netatmo.Password, "Password of NetAtmo account.") flagSet.StringVarP(&cfg.Netatmo.Password, "password", "p", cfg.Netatmo.Password, "Password of NetAtmo account.")
flagSet.Parse(args[1:]) flagSet.Parse(args[1:])
applyEnvironment(&cfg, getenv) if err := applyEnvironment(&cfg, getenv); err != nil {
return config{}, fmt.Errorf("error in environment: %s", err)
}
if len(cfg.Addr) == 0 { if len(cfg.Addr) == 0 {
return cfg, errNoListenAddress return config{}, errNoListenAddress
} }
if len(cfg.Netatmo.ClientID) == 0 { if len(cfg.Netatmo.ClientID) == 0 {
return cfg, errNoNetatmoClientID return config{}, errNoNetatmoClientID
} }
if len(cfg.Netatmo.ClientSecret) == 0 { if len(cfg.Netatmo.ClientSecret) == 0 {
return cfg, errNoNetatmoClientSecret return config{}, errNoNetatmoClientSecret
} }
if len(cfg.Netatmo.Username) == 0 { if len(cfg.Netatmo.Username) == 0 {
return cfg, errNoNetatmoUsername return config{}, errNoNetatmoUsername
} }
if len(cfg.Netatmo.Password) == 0 { if len(cfg.Netatmo.Password) == 0 {
return cfg, errNoNetatmoPassword return config{}, errNoNetatmoPassword
} }
return cfg, nil return cfg, nil
} }
func applyEnvironment(cfg *config, getenv func(string) string) { func applyEnvironment(cfg *config, getenv func(string) string) error {
if envAddr := getenv(envVarListenAddress); envAddr != "" { if envAddr := getenv(envVarListenAddress); envAddr != "" {
cfg.Addr = envAddr cfg.Addr = envAddr
} }
if envLogLevel := getenv(envVarLogLevel); envLogLevel != "" {
if err := cfg.LogLevel.Set(envLogLevel); err != nil {
return err
}
}
if envClientID := getenv(envVarNetatmoClientID); envClientID != "" { if envClientID := getenv(envVarNetatmoClientID); envClientID != "" {
cfg.Netatmo.ClientID = envClientID cfg.Netatmo.ClientID = envClientID
} }
@ -99,4 +134,6 @@ func applyEnvironment(cfg *config, getenv func(string) string) {
if envPassword := getenv(envVarNetatmoPassword); envPassword != "" { if envPassword := getenv(envVarNetatmoPassword); envPassword != "" {
cfg.Netatmo.Password = envPassword cfg.Netatmo.Password = envPassword
} }
return nil
} }

View file

@ -5,6 +5,7 @@ import (
"testing" "testing"
netatmo "github.com/exzz/netatmo-api-go" netatmo "github.com/exzz/netatmo-api-go"
"github.com/sirupsen/logrus"
) )
func TestParseConfig(t *testing.T) { func TestParseConfig(t *testing.T) {
@ -38,6 +39,7 @@ func TestParseConfig(t *testing.T) {
env: map[string]string{}, env: map[string]string{},
wantConfig: config{ wantConfig: config{
Addr: defaultConfig.Addr, Addr: defaultConfig.Addr,
LogLevel: logLevel(logrus.InfoLevel),
Netatmo: netatmo.Config{ Netatmo: netatmo.Config{
ClientID: "id", ClientID: "id",
ClientSecret: "secret", ClientSecret: "secret",
@ -54,6 +56,7 @@ func TestParseConfig(t *testing.T) {
}, },
env: map[string]string{ env: map[string]string{
envVarListenAddress: ":8080", envVarListenAddress: ":8080",
envVarLogLevel: "debug",
envVarNetatmoClientID: "id", envVarNetatmoClientID: "id",
envVarNetatmoClientSecret: "secret", envVarNetatmoClientSecret: "secret",
envVarNetatmoUsername: "username", envVarNetatmoUsername: "username",
@ -61,6 +64,7 @@ func TestParseConfig(t *testing.T) {
}, },
wantConfig: config{ wantConfig: config{
Addr: ":8080", Addr: ":8080",
LogLevel: logLevel(logrus.DebugLevel),
Netatmo: netatmo.Config{ Netatmo: netatmo.Config{
ClientID: "id", ClientID: "id",
ClientSecret: "secret", ClientSecret: "secret",

View file

@ -27,6 +27,7 @@ func main() {
if err != nil { if err != nil {
log.Fatalf("Error in configuration: %s", err) log.Fatalf("Error in configuration: %s", err)
} }
log.SetLevel(logrus.Level(cfg.LogLevel))
log.Infof("Login as %s", cfg.Netatmo.Username) log.Infof("Login as %s", cfg.Netatmo.Username)
client, err := netatmo.NewClient(cfg.Netatmo) client, err := netatmo.NewClient(cfg.Netatmo)