Nimbus: runtime log level selection and logfile option

This commit is contained in:
Ștefan Talpalaru 2019-03-20 14:41:25 +01:00 committed by zah
parent efadc8d2a9
commit 50504cf553
4 changed files with 53 additions and 15 deletions

View File

@ -36,5 +36,5 @@ task test, "Run tests":
test "test_rpc" test "test_rpc"
task nimbus, "Build Nimbus": task nimbus, "Build Nimbus":
buildBinary "nimbus", "nimbus/" buildBinary "nimbus", "nimbus/", "-d:chronicles_log_level=TRACE"

View File

@ -136,6 +136,8 @@ type
DebugConfiguration* = object DebugConfiguration* = object
## Debug configuration object ## Debug configuration object
flags*: set[DebugFlags] ## Debug flags flags*: set[DebugFlags] ## Debug flags
logLevel*: LogLevel ## Log level
logFile*: string ## Log file
PruneMode* {.pure.} = enum PruneMode* {.pure.} = enum
Full Full
@ -168,6 +170,7 @@ type
const const
defaultRpcApi = {RpcFlags.Eth, RpcFlags.Shh} defaultRpcApi = {RpcFlags.Eth, RpcFlags.Shh}
defaultLogLevel = LogLevel.WARN
var nimbusConfig {.threadvar.}: NimbusConfiguration var nimbusConfig {.threadvar.}: NimbusConfiguration
@ -491,25 +494,38 @@ proc processDebugArguments(key, value: string): ConfigStatus =
config.debug.flags.incl(DebugFlags.Test2) config.debug.flags.incl(DebugFlags.Test2)
elif item == "test3": elif item == "test3":
config.debug.flags.incl(DebugFlags.Test3) config.debug.flags.incl(DebugFlags.Test3)
elif skey == "log-level":
try:
let logLevel = parseEnum[LogLevel](value)
if logLevel >= enabledLogLevel:
config.debug.logLevel = logLevel
else: else:
result = EmptyOption result = ErrorIncorrectOption
except ValueError:
result = ErrorIncorrectOption
elif skey == "log-file":
if len(value) == 0:
result = ErrorIncorrectOption
else:
config.debug.logFile = value
proc dumpConfiguration*(): string = proc dumpConfiguration*(): string =
## Dumps current configuration as string ## Dumps current configuration as string
let config = getConfiguration() let config = getConfiguration()
result = repr config result = repr config
template checkArgument(a, b, c, e: untyped) = template processArgument(processor, key, value, msg: untyped) =
## Checks if arguments got processed successfully ## Checks if arguments got processed successfully
var res = (a)(string((b)), string((c))) var res = processor(string(key), string(value))
if res == Success: if res == Success:
result = res
continue continue
elif res == ErrorParseOption: elif res == ErrorParseOption:
(e) = "Error processing option [" & key & "] with value [" & value & "]" msg = "Error processing option '" & key & "' with value '" & value & "'."
result = res result = res
break break
elif res == ErrorIncorrectOption: elif res == ErrorIncorrectOption:
(e) = "Incorrect value for option [" & key & "] value [" & value & "]" msg = "Incorrect value for option '" & key & "': '" & value & "'."
result = res result = res
break break
@ -543,6 +559,7 @@ proc initConfiguration(): NimbusConfiguration =
## Debug defaults ## Debug defaults
result.debug.flags = {} result.debug.flags = {}
result.debug.logLevel = defaultLogLevel
proc getConfiguration*(): NimbusConfiguration = proc getConfiguration*(): NimbusConfiguration =
## Retreive current configuration object `NimbusConfiguration`. ## Retreive current configuration object `NimbusConfiguration`.
@ -551,6 +568,12 @@ proc getConfiguration*(): NimbusConfiguration =
result = nimbusConfig result = nimbusConfig
proc getHelpString*(): string = proc getHelpString*(): string =
var logLevels: seq[string]
for level in LogLevel:
if level < enabledLogLevel:
continue
logLevels.add($level)
result = """ result = """
USAGE: USAGE:
@ -586,10 +609,14 @@ API AND CONSOLE OPTIONS:
--rpcapi:<value> Enable specific set of rpc api from comma separated list(eth, shh, debug) --rpcapi:<value> Enable specific set of rpc api from comma separated list(eth, shh, debug)
LOGGING AND DEBUGGING OPTIONS: LOGGING AND DEBUGGING OPTIONS:
--log-level:<value> One of: $2 (default: $3)
--log-file:<value> Optional log file, replacing stdout
--debug Enable debug mode --debug Enable debug mode
--test:<value> Perform specified test --test:<value> Perform specified test
""" % [ """ % [
NimbusIdent NimbusIdent,
join(logLevels, ", "),
$defaultLogLevel
] ]
proc processArguments*(msg: var string): ConfigStatus = proc processArguments*(msg: var string): ConfigStatus =
@ -612,6 +639,7 @@ proc processArguments*(msg: var string): ConfigStatus =
var opt = initOptParser() var opt = initOptParser()
var length = 0 var length = 0
for kind, key, value in opt.getopt(): for kind, key, value in opt.getopt():
result = Error
case kind case kind
of cmdArgument: of cmdArgument:
discard discard
@ -627,12 +655,14 @@ proc processArguments*(msg: var string): ConfigStatus =
result = Success result = Success
break break
else: else:
checkArgument processEthArguments, key, value, msg processArgument processEthArguments, key, value, msg
checkArgument processRpcArguments, key, value, msg processArgument processRpcArguments, key, value, msg
checkArgument processNetArguments, key, value, msg processArgument processNetArguments, key, value, msg
checkArgument processDebugArguments, key, value, msg processArgument processDebugArguments, key, value, msg
if result != Success:
msg = "Unknown option: '" & key & "'."
of cmdEnd: of cmdEnd:
doAssert(false) doAssert(false) # we're never getting this kind here
if config.net.bootNodes.len == 0: if config.net.bootNodes.len == 0:
# No custom bootnodes were specified on the command line, restore to # No custom bootnodes were specified on the command line, restore to
@ -642,6 +672,7 @@ proc processArguments*(msg: var string): ConfigStatus =
if config.net.discPort == 0: if config.net.discPort == 0:
config.net.discPort = config.net.bindPort config.net.discPort = config.net.bindPort
proc processConfig*(pathname: string): ConfigStatus = proc processConfiguration*(pathname: string): ConfigStatus =
## Process configuration file `pathname` and update `NimbusConfiguration`. ## Process configuration file `pathname` and update `NimbusConfiguration`.
result = Success result = Success

View File

@ -1,5 +1,6 @@
-d:chronicles_line_numbers -d:chronicles_line_numbers
-d:"chronicles_sinks=textblocks" -d:"chronicles_sinks=textblocks[file]"
-d:"chronicles_runtime_filtering=on"
# https://github.com/nim-lang/Nim/issues/8294#issuecomment-454556051 # https://github.com/nim-lang/Nim/issues/8294#issuecomment-454556051
@if windows: @if windows:
-d:"chronicles_colors=NoColors" -d:"chronicles_colors=NoColors"

View File

@ -40,6 +40,12 @@ proc start(): NimbusObject =
var nimbus = NimbusObject() var nimbus = NimbusObject()
var conf = getConfiguration() var conf = getConfiguration()
setLogLevel(conf.debug.logLevel)
if len(conf.debug.logFile) != 0:
discard defaultChroniclesStream.output.open(conf.debug.logFile, fmAppend)
else:
discard defaultChroniclesStream.output.open(stdout)
## Creating RPC Server ## Creating RPC Server
if RpcFlags.Enabled in conf.rpc.flags: if RpcFlags.Enabled in conf.rpc.flags:
nimbus.rpcServer = newRpcHttpServer(conf.rpc.binds) nimbus.rpcServer = newRpcHttpServer(conf.rpc.binds)