[NOD-410] Add log level CLI argument to API server (#503)

* [NOD-410] Add log level CLI argument to API server

* [NOD-410] Add comments

* [NOD-410] Remove pre-allocation of one item
This commit is contained in:
Ori Newman 2019-12-01 17:24:12 +02:00 committed by Svarog
parent 3dcf8d88b8
commit 2402bae1ff
7 changed files with 47 additions and 16 deletions

View File

@ -30,6 +30,7 @@ func ActiveConfig() *Config {
// Config defines the configuration options for the API server.
type Config struct {
LogDir string `long:"logdir" description:"Directory to log output."`
DebugLevel string `short:"d" long:"debuglevel" description:"Set log level {trace, debug, info, warn, error, critical}"`
RPCUser string `short:"u" long:"rpcuser" description:"RPC username"`
RPCPassword string `short:"P" long:"rpcpass" default-mask:"-" description:"RPC password"`
RPCServer string `short:"s" long:"rpcserver" description:"RPC server to connect to"`
@ -48,7 +49,7 @@ type Config struct {
}
// Parse parses the CLI arguments and returns a config struct.
func Parse() (*Config, error) {
func Parse() error {
activeConfig = &Config{
LogDir: defaultLogDir,
DBAddress: defaultDBAddress,
@ -57,42 +58,49 @@ func Parse() (*Config, error) {
parser := flags.NewParser(activeConfig, flags.PrintErrors|flags.HelpFlag)
_, err := parser.Parse()
if err != nil {
return nil, err
return err
}
if !activeConfig.Migrate {
if activeConfig.RPCUser == "" {
return nil, errors.New("--rpcuser is required if --migrate flag is not used")
return errors.New("--rpcuser is required if --migrate flag is not used")
}
if activeConfig.RPCPassword == "" {
return nil, errors.New("--rpcpass is required if --migrate flag is not used")
return errors.New("--rpcpass is required if --migrate flag is not used")
}
if activeConfig.RPCServer == "" {
return nil, errors.New("--rpcserver is required if --migrate flag is not used")
return errors.New("--rpcserver is required if --migrate flag is not used")
}
}
if activeConfig.RPCCert == "" && !activeConfig.DisableTLS {
return nil, errors.New("--notls has to be disabled if --cert is used")
return errors.New("--notls has to be disabled if --cert is used")
}
if activeConfig.RPCCert != "" && activeConfig.DisableTLS {
return nil, errors.New("--cert should be omitted if --notls is used")
return errors.New("--cert should be omitted if --notls is used")
}
if (activeConfig.MQTTBrokerAddress != "" || activeConfig.MQTTUser != "" || activeConfig.MQTTPassword != "") &&
(activeConfig.MQTTBrokerAddress == "" || activeConfig.MQTTUser == "" || activeConfig.MQTTPassword == "") {
return nil, errors.New("--mqttaddress, --mqttuser, and --mqttpass must be passed all together")
return errors.New("--mqttaddress, --mqttuser, and --mqttpass must be passed all together")
}
err = activeConfig.ResolveNetwork(parser)
if err != nil {
return nil, err
return err
}
logFile := filepath.Join(activeConfig.LogDir, defaultLogFilename)
errLogFile := filepath.Join(activeConfig.LogDir, defaultErrLogFilename)
logger.InitLog(logFile, errLogFile)
return activeConfig, nil
if activeConfig.DebugLevel != "" {
err := logger.SetLogLevels(activeConfig.DebugLevel)
if err != nil {
return err
}
}
return nil
}

View File

@ -4,6 +4,6 @@ import "github.com/daglabs/btcd/util/panics"
import "github.com/daglabs/btcd/apiserver/logger"
var (
log = logger.BackendLog.Logger("DTBS")
log = logger.Logger("DTBS")
spawn = panics.GoroutineWrapperFunc(log, logger.BackendLog)
)

View File

@ -6,6 +6,6 @@ import (
)
var (
log = logger.BackendLog.Logger("APIS")
log = logger.Logger("APIS")
spawn = panics.GoroutineWrapperFunc(log, logger.BackendLog)
)

View File

@ -3,11 +3,13 @@ package logger
import (
"fmt"
"github.com/daglabs/btcd/logs"
"github.com/pkg/errors"
"os"
)
// BackendLog is the logging backend used to create all subsystem loggers.
var BackendLog = logs.NewBackend()
var loggers []logs.Logger
// InitLog attaches log file and error log file to the backend log.
func InitLog(logFile, errLogFile string) {
@ -22,3 +24,24 @@ func InitLog(logFile, errLogFile string) {
os.Exit(1)
}
}
// Logger returns a new logger for a particular subsystem that writes to
// BackendLog, and add it to a slice so it will be possible to access it
// later and change its log level
func Logger(subsystemTag string) logs.Logger {
logger := BackendLog.Logger(subsystemTag)
loggers = append(loggers, logger)
return logger
}
// SetLogLevels sets the logging level for all of the subsystems in the API server.
func SetLogLevels(level string) error {
lvl, ok := logs.LevelFromString(level)
if !ok {
return errors.Errorf("Invalid log level %s", level)
}
for _, logger := range loggers {
logger.SetLevel(lvl)
}
return nil
}

View File

@ -21,7 +21,7 @@ import (
func main() {
defer panics.HandlePanic(log, logger.BackendLog, nil)
cfg, err := config.Parse()
err := config.Parse()
if err != nil {
errString := fmt.Sprintf("Error parsing command-line arguments: %s", err)
_, fErr := fmt.Fprintf(os.Stderr, errString)
@ -31,7 +31,7 @@ func main() {
return
}
if cfg.Migrate {
if config.ActiveConfig().Migrate {
err := database.Migrate()
if err != nil {
panic(errors.Errorf("Error migrating database: %s", err))

View File

@ -4,6 +4,6 @@ import "github.com/daglabs/btcd/util/panics"
import "github.com/daglabs/btcd/apiserver/logger"
var (
log = logger.BackendLog.Logger("MQTT")
log = logger.Logger("MQTT")
spawn = panics.GoroutineWrapperFunc(log, logger.BackendLog)
)

View File

@ -4,6 +4,6 @@ import "github.com/daglabs/btcd/util/panics"
import "github.com/daglabs/btcd/apiserver/logger"
var (
log = logger.BackendLog.Logger("REST")
log = logger.Logger("REST")
spawn = panics.GoroutineWrapperFunc(log, logger.BackendLog)
)