Add option to correctly use logback config (#1398)

* Logger now uses correct parent logger for all, names appenders correctly

* Set logback to true for tests, rename file

* Fix docs
This commit is contained in:
Ben Carman 2020-05-20 15:46:24 -05:00 committed by GitHub
parent 11255390d2
commit 99db9062ac
25 changed files with 135 additions and 72 deletions

View file

@ -3,6 +3,9 @@ bitcoin-s {
network = regtest # regtest, testnet3, mainnet
logging {
# Ignore bitcoin-s logging config and use a logback config
logback = false
level = WARN # trace, debug, info, warn, error, off
# You can also tune specific module loggers.

View file

@ -22,9 +22,9 @@ import org.bitcoins.db.AppConfig
case class BitcoinSAppConfig(
private val directory: Path,
private val confs: Config*)(implicit ec: ExecutionContext) {
val walletConf = WalletAppConfig(directory, confs: _*)
val nodeConf = NodeAppConfig(directory, confs: _*)
val chainConf = ChainAppConfig(directory, confs: _*)
val walletConf: WalletAppConfig = WalletAppConfig(directory, false, confs: _*)
val nodeConf: NodeAppConfig = NodeAppConfig(directory, false, confs: _*)
val chainConf: ChainAppConfig = ChainAppConfig(directory, false, confs: _*)
/** Initializes the wallet, node and chain projects */
def initialize()(implicit ec: ExecutionContext): Future[Unit] = {

View file

@ -1,11 +1,12 @@
package org.bitcoins.server
import org.bitcoins.db.{AppConfig, AppLoggers, MarkedLogger}
import org.bitcoins.db.{AppLoggers, LoggerConfig}
import org.slf4j.Logger
/** Exposes access to the HTTP RPC server logger */
private[bitcoins] trait HttpLogger {
private var _logger: MarkedLogger = _
protected[bitcoins] def logger(implicit config: AppConfig) = {
private var _logger: Logger = _
protected[bitcoins] def logger(implicit config: LoggerConfig): Logger = {
if (_logger == null) {
_logger = HttpLoggerImpl(config).getLogger
}
@ -13,12 +14,12 @@ private[bitcoins] trait HttpLogger {
}
}
private[server] case class HttpLoggerImpl(override val conf: AppConfig)
private[server] case class HttpLoggerImpl(override val conf: LoggerConfig)
extends AppLoggers {
/**
* @return the HTTP RPC server submobule logger
*/
def getLogger: MarkedLogger =
def getLogger: Logger =
getLoggerImpl(LoggerKind.Http)
}

View file

@ -1,16 +1,16 @@
package org.bitcoins.server
import upickle.{default => up}
import akka.actor.ActorSystem
import akka.http.scaladsl._
import akka.stream.ActorMaterializer
import akka.http.scaladsl.model._
import akka.http.scaladsl.server._
import akka.http.scaladsl.server.Directives._
import de.heikoseeberger.akkahttpupickle.UpickleSupport._
import akka.http.scaladsl.server.directives.DebuggingDirectives
import akka.event.Logging
import akka.http.scaladsl._
import akka.http.scaladsl.model._
import akka.http.scaladsl.server.Directives._
import akka.http.scaladsl.server._
import akka.http.scaladsl.server.directives.DebuggingDirectives
import akka.stream.ActorMaterializer
import de.heikoseeberger.akkahttpupickle.UpickleSupport._
import org.bitcoins.db.AppConfig
import upickle.{default => up}
import scala.concurrent.Future

View file

@ -12,7 +12,7 @@ import org.scalatest.FutureOutcome
class ChainAppConfigTest extends ChainUnitTest {
val tempDir = Files.createTempDirectory("bitcoin-s")
val config = ChainAppConfig(directory = tempDir)
val config = ChainAppConfig(directory = tempDir, useLogbackConf = false)
//if we don't turn off logging here, isInitF a few lines down will
//produce some nasty error logs since we are testing initialization
@ -72,7 +72,7 @@ class ChainAppConfigTest extends ChainUnitTest {
""".stripMargin
val _ = Files.write(tempFile, confStr.getBytes())
val appConfig = ChainAppConfig(directory = tempDir)
val appConfig = ChainAppConfig(directory = tempDir, useLogbackConf = false)
assert(appConfig.datadir == tempDir.resolve("testnet3"))
assert(appConfig.network == TestNet3)

View file

@ -1,12 +1,12 @@
package org.bitcoins.chain
import org.bitcoins.db.{AppLoggers, MarkedLogger}
import org.bitcoins.chain.config.ChainAppConfig
import org.bitcoins.db.{AppLoggers, LoggerConfig}
import org.slf4j.Logger
/** Exposes access to the chain verification logger */
private[bitcoins] trait ChainVerificationLogger {
private var _logger: MarkedLogger = _
protected[bitcoins] def logger(implicit config: ChainAppConfig) = {
private var _logger: Logger = _
protected[bitcoins] def logger(implicit config: LoggerConfig): Logger = {
if (_logger == null) {
_logger = ChainVerificationLoggerImpl(config).getLogger
}
@ -15,12 +15,12 @@ private[bitcoins] trait ChainVerificationLogger {
}
private[chain] case class ChainVerificationLoggerImpl(
override val conf: ChainAppConfig)
override val conf: LoggerConfig)
extends AppLoggers {
/**
* @return the chain verification submobule logger
*/
def getLogger: MarkedLogger =
def getLogger: Logger =
getLoggerImpl(LoggerKind.ChainVerification)
}

View file

@ -16,6 +16,7 @@ import scala.concurrent.{ExecutionContext, Future}
*/
case class ChainAppConfig(
private val directory: Path,
override val useLogbackConf: Boolean,
private val confs: Config*)(implicit override val ec: ExecutionContext)
extends AppConfig
with ChainDbManagement
@ -26,7 +27,7 @@ case class ChainAppConfig(
override protected[bitcoins] type ConfigType = ChainAppConfig
override protected[bitcoins] def newConfigOfType(
configs: Seq[Config]): ChainAppConfig =
ChainAppConfig(directory, configs: _*)
ChainAppConfig(directory, useLogbackConf, configs: _*)
protected[bitcoins] def baseDatadir: Path = directory
override def appConfig: ChainAppConfig = this
@ -99,7 +100,9 @@ object ChainAppConfig {
/** Constructs a chain verification configuration from the default Bitcoin-S
* data directory and given list of configuration overrides.
*/
def fromDefaultDatadir(confs: Config*)(
def fromDefaultDatadir(useLogbackConf: Boolean, confs: Config*)(
implicit ec: ExecutionContext): ChainAppConfig =
ChainAppConfig(AppConfig.DEFAULT_BITCOIN_S_DATADIR, confs: _*)
ChainAppConfig(AppConfig.DEFAULT_BITCOIN_S_DATADIR,
useLogbackConf,
confs: _*)
}

View file

@ -44,6 +44,7 @@ class DbManagementTest extends BitcoinSAsyncTest {
it must "run migrations for chain db" in {
val chainAppConfig = ChainAppConfig(BitcoinSTestAppConfig.tmpDir(),
useLogbackConf = false,
dbConfig(ProjectType.Chain))
val chainDbManagement = createChainDbManagement(chainAppConfig)
val result = chainDbManagement.migrate()
@ -52,6 +53,7 @@ class DbManagementTest extends BitcoinSAsyncTest {
it must "run migrations for wallet db" in {
val walletAppConfig = WalletAppConfig(BitcoinSTestAppConfig.tmpDir(),
useLogbackConf = false,
dbConfig(ProjectType.Wallet))
val walletDbManagement = createWalletDbManagement(walletAppConfig)
val result = walletDbManagement.migrate()
@ -60,7 +62,9 @@ class DbManagementTest extends BitcoinSAsyncTest {
it must "run migrations for node db" in {
val nodeAppConfig =
NodeAppConfig(BitcoinSTestAppConfig.tmpDir(), dbConfig(ProjectType.Node))
NodeAppConfig(BitcoinSTestAppConfig.tmpDir(),
useLogbackConf = false,
dbConfig(ProjectType.Node))
val nodeDbManagement = createNodeDbManagement(nodeAppConfig)
val result = nodeDbManagement.migrate()
assert(result == 1)

View file

@ -29,7 +29,7 @@ import ch.qos.logback.classic.Level
* @see [[https://github.com/bitcoin-s/bitcoin-s-core/blob/master/doc/configuration.md `configuration.md`]]
* for more information.
*/
abstract class AppConfig {
abstract class AppConfig extends LoggerConfig {
private val logger = BitcoinSLogger.logger
@ -240,6 +240,8 @@ abstract class AppConfig {
baseDatadir.resolve(lastDirname)
}
override val logFile: Path = datadir.resolve("bitcoin-s.log")
private def stringToLogLevel(str: String): Option[Level] =
str.toLowerCase() match {
case "trace" => Some(Level.TRACE)
@ -279,25 +281,29 @@ abstract class AppConfig {
}
/** The logging level for our P2P logger */
lazy val p2pLogLevel: Level = levelOrDefault("logging.p2p")
override lazy val p2pLogLevel: Level = levelOrDefault("logging.p2p")
/** The logging level for our chain verification logger */
lazy val verificationLogLevel: Level =
override lazy val verificationLogLevel: Level =
levelOrDefault("logging.chain-verification")
/** The logging level for our key handling logger */
lazy val keyHandlingLogLevel: Level =
override lazy val keyHandlingLogLevel: Level =
levelOrDefault("logging.key-handling")
/** Logging level for wallet */
lazy val walletLogLeveL: Level =
override lazy val walletLogLevel: Level =
levelOrDefault("logging.wallet")
/** Logging level for HTTP RPC server */
lazy val httpLogLevel: Level = levelOrDefault("logging.http")
override lazy val httpLogLevel: Level = levelOrDefault("logging.http")
/** Logging level for database interactions */
lazy val databaseLogLevel: Level = levelOrDefault("logging.database")
override lazy val databaseLogLevel: Level = levelOrDefault("logging.database")
/** Use logback config instead */
override val useLogbackConf: Boolean =
config.getBooleanOrElse("logging.logback", default = false)
}

View file

@ -29,6 +29,15 @@ package object db {
None
}
}
/** Returns the boolean at key or the given default value */
def getBooleanOrElse(key: String, default: => Boolean): Boolean = {
if (config.hasPath(key)) {
config.getBoolean(key)
} else {
default
}
}
}
}

View file

@ -60,7 +60,7 @@ val config = ConfigFactory.parseString {
|""".stripMargin
}
implicit val chainConfig = ChainAppConfig(datadir, config)
implicit val chainConfig = ChainAppConfig(datadir, false, config)
// Initialize the needed database tables if they don't exist:
val chainProjectInitF = chainConfig.initialize()

View file

@ -28,16 +28,16 @@ import scala.util.Properties
import scala.concurrent.ExecutionContext.Implicits.global
// reads $HOME/.bitcoin-s/
val defaultConfig = WalletAppConfig.fromDefaultDatadir()
val defaultConfig = WalletAppConfig.fromDefaultDatadir(false)
// reads a custom data directory
val customDirectory = Paths.get(Properties.userHome, "custom-bitcoin-s-directory")
val configFromCustomDatadir = WalletAppConfig(customDirectory)
val configFromCustomDatadir = WalletAppConfig(customDirectory, false)
// reads a custom data directory and overrides the network to be testnet3
val customOverride = ConfigFactory.parseString("bitcoin-s.network = testnet3")
val configFromCustomDirAndOverride = WalletAppConfig(customDirectory, customOverride)
val configFromCustomDirAndOverride = WalletAppConfig(customDirectory, false, customOverride)
```
You can pass as many `com.typesafe.config.Config`s as you'd like. If any
@ -75,6 +75,9 @@ bitcoin-s {
network = regtest # regtest, testnet3, mainnet
logging {
# Ignore bitcoin-s logging config and use a logback config
logback = false
level = WARN # trace, debug, info, warn, error, off
# You can also tune specific module loggers.

View file

@ -87,10 +87,10 @@ val config = ConfigFactory.parseString {
val datadir = Files.createTempDirectory("bitcoin-s-wallet")
implicit val walletConfig = WalletAppConfig(datadir, config)
implicit val walletConfig = WalletAppConfig(datadir, false, config)
// we also need to store chain state for syncing purposes
implicit val chainConfig = ChainAppConfig(datadir, config)
implicit val chainConfig = ChainAppConfig(datadir, false, config)
// when this future completes, we have
// created the necessary directories and

View file

@ -12,7 +12,9 @@ import java.nio.file.Files
class NodeAppConfigTest extends BitcoinSAsyncTest {
val tempDir = Files.createTempDirectory("bitcoin-s")
val config = NodeAppConfig(directory = tempDir)
val config: NodeAppConfig =
NodeAppConfig(directory = tempDir, useLogbackConf = false)
it must "be overridable" in {
assert(config.network == RegTest)
@ -51,7 +53,7 @@ class NodeAppConfigTest extends BitcoinSAsyncTest {
""".stripMargin
val _ = Files.write(tempFile, confStr.getBytes())
val appConfig = NodeAppConfig(directory = tempDir)
val appConfig = NodeAppConfig(directory = tempDir, useLogbackConf = false)
assert(appConfig.datadir == tempDir.resolve("testnet3"))
assert(appConfig.network == TestNet3)

View file

@ -25,6 +25,7 @@ import org.bitcoins.node.networking.peer.{
}
import org.bitcoins.node.util.BitcoinSNodeUtil.Mutable
import org.bitcoins.rpc.util.AsyncUtil
import org.slf4j.Logger
import scala.concurrent.duration.DurationInt
import scala.concurrent.{ExecutionContext, Future}
@ -54,6 +55,11 @@ trait Node extends NodeApi with ChainQueryApi with P2PLogger {
this
}
// Need to overwrite logger because nodeAppConfig and chainAppConfig are both
// instances of LoggerConfig
protected def logger(implicit config: NodeAppConfig): Logger =
super.logger(config)
lazy val txDAO = BroadcastAbleTransactionDAO()
/** This is constructing a chain api from disk every time we call this method

View file

@ -5,8 +5,8 @@ import org.bitcoins.core.protocol.blockchain.{Block, BlockHeader, MerkleBlock}
import org.bitcoins.core.protocol.transaction.Transaction
import org.bitcoins.core.util.FutureUtil
import org.bitcoins.crypto.DoubleSha256Digest
import org.bitcoins.db.MarkedLogger
import org.bitcoins.node.networking.peer.DataMessageHandler._
import org.slf4j.Logger
import scala.concurrent.{ExecutionContext, Future}
@ -32,7 +32,7 @@ case class NodeCallbacks(
onBlockHeadersReceived = onBlockHeadersReceived ++ other.onBlockHeadersReceived
)
def executeOnTxReceivedCallbacks(logger: MarkedLogger, tx: Transaction)(
def executeOnTxReceivedCallbacks(logger: Logger, tx: Transaction)(
implicit ec: ExecutionContext): Future[Unit] = {
onTxReceived
.foldLeft(FutureUtil.unit)((acc, callback) =>
@ -43,7 +43,7 @@ case class NodeCallbacks(
}))
}
def executeOnBlockReceivedCallbacks(logger: MarkedLogger, block: Block)(
def executeOnBlockReceivedCallbacks(logger: Logger, block: Block)(
implicit ec: ExecutionContext): Future[Unit] = {
onBlockReceived
.foldLeft(FutureUtil.unit)((acc, callback) =>
@ -55,7 +55,7 @@ case class NodeCallbacks(
}
def executeOnMerkleBlockReceivedCallbacks(
logger: MarkedLogger,
logger: Logger,
merkleBlock: MerkleBlock,
txs: Vector[Transaction])(implicit ec: ExecutionContext): Future[Unit] = {
onMerkleBlockReceived
@ -69,7 +69,7 @@ case class NodeCallbacks(
}
def executeOnCompactFiltersReceivedCallbacks(
logger: MarkedLogger,
logger: Logger,
blockFilters: Vector[(DoubleSha256Digest, GolombFilter)])(
implicit ec: ExecutionContext): Future[Unit] = {
onCompactFiltersReceived
@ -84,7 +84,7 @@ case class NodeCallbacks(
}
def executeOnBlockHeadersReceivedCallbacks(
logger: MarkedLogger,
logger: Logger,
headers: Vector[BlockHeader])(
implicit ec: ExecutionContext): Future[Unit] = {
onBlockHeadersReceived

View file

@ -1,12 +1,12 @@
package org.bitcoins.node
import org.bitcoins.node.config.NodeAppConfig
import org.bitcoins.db.{AppLoggers, MarkedLogger}
import org.bitcoins.db.{AppLoggers, LoggerConfig}
import org.slf4j.Logger
/** Exposes access to the P2P submodule logger */
private[bitcoins] trait P2PLogger {
private var _logger: MarkedLogger = _
protected def logger(implicit config: NodeAppConfig) = {
private var _logger: Logger = _
protected def logger(implicit config: LoggerConfig): Logger = {
if (_logger == null) {
_logger = P2PLoggerImpl(config).getLogger
}
@ -14,12 +14,12 @@ private[bitcoins] trait P2PLogger {
}
}
private[node] case class P2PLoggerImpl(override val conf: NodeAppConfig)
private[node] case class P2PLoggerImpl(override val conf: LoggerConfig)
extends AppLoggers {
/**
* @return the peer-to-peer submobule logger
*/
def getLogger: MarkedLogger =
def getLogger: Logger =
getLoggerImpl(LoggerKind.P2P)
}

View file

@ -15,6 +15,7 @@ import scala.concurrent.{ExecutionContext, Future}
*/
case class NodeAppConfig(
private val directory: Path,
override val useLogbackConf: Boolean,
private val confs: Config*)(implicit override val ec: ExecutionContext)
extends AppConfig
with NodeDbManagement
@ -24,7 +25,7 @@ case class NodeAppConfig(
override protected[bitcoins] type ConfigType = NodeAppConfig
override protected[bitcoins] def newConfigOfType(
configs: Seq[Config]): NodeAppConfig =
NodeAppConfig(directory, configs: _*)
NodeAppConfig(directory, useLogbackConf, configs: _*)
protected[bitcoins] def baseDatadir: Path = directory
@ -74,8 +75,10 @@ object NodeAppConfig {
/** Constructs a node configuration from the default Bitcoin-S
* data directory and given list of configuration overrides.
*/
def fromDefaultDatadir(confs: Config*)(
def fromDefaultDatadir(useLogbackConf: Boolean, confs: Config*)(
implicit ec: ExecutionContext): NodeAppConfig =
NodeAppConfig(AppConfig.DEFAULT_BITCOIN_S_DATADIR, confs: _*)
NodeAppConfig(AppConfig.DEFAULT_BITCOIN_S_DATADIR,
useLogbackConf,
confs: _*)
}

View file

@ -11,6 +11,7 @@ import org.bitcoins.crypto.{DoubleSha256Digest, DoubleSha256DigestBE}
import org.bitcoins.node.config.NodeAppConfig
import org.bitcoins.node.models.BroadcastAbleTransactionDAO
import org.bitcoins.node.{NodeCallbacks, P2PLogger}
import org.slf4j.Logger
import scala.concurrent.{ExecutionContext, Future}
@ -31,6 +32,11 @@ case class DataMessageHandler(
chainConfig: ChainAppConfig)
extends P2PLogger {
// Need to overwrite logger because nodeAppConfig and chainAppConfig are both
// instances of LoggerConfig
protected def logger(implicit config: NodeAppConfig): Logger =
super.logger(config)
private val txDAO = BroadcastAbleTransactionDAO()
def handleDataPayload(

View file

@ -20,6 +20,7 @@ import org.bitcoins.node.networking.peer.PeerMessageReceiverState.{
Normal,
Preconnection
}
import org.slf4j.Logger
import scala.concurrent.Future
@ -42,6 +43,11 @@ class PeerMessageReceiver(
extends P2PLogger {
import ref.dispatcher
// Need to overwrite logger because nodeAppConfig and chainAppConfig are both
// instances of LoggerConfig
protected def logger(implicit config: NodeAppConfig): Logger =
super.logger(config)
/** This method is called when we have received
* a [[akka.io.Tcp.Connected]] message from our peer
* This means we have opened a Tcp connection,

View file

@ -3,6 +3,9 @@ bitcoin-s {
network = regtest # regtest, testnet3, mainnet
logging {
# Ignore bitcoin-s logging config and use a logback config
logback = true
level = WARN # trace, debug, info, warn, error, off
# You can also tune specific module loggers.

View file

@ -226,7 +226,8 @@ object NodeUnitTest extends P2PLogger {
nodeConnectedWithBitcoind: NodeConnectedWithBitcoind)(
implicit system: ActorSystem,
appConfig: BitcoinSAppConfig): Future[Unit] = {
logger.debug(s"Beggining tear down of node connected with bitcoind")
logger(appConfig.nodeConf)
.debug(s"Beggining tear down of node connected with bitcoind")
import system.dispatcher
val node = nodeConnectedWithBitcoind.node
val bitcoind = nodeConnectedWithBitcoind.bitcoind
@ -234,7 +235,8 @@ object NodeUnitTest extends P2PLogger {
_ <- destroyNode(node)
_ <- ChainUnitTest.destroyBitcoind(bitcoind)
} yield {
logger.debug(s"Done with teardown of node connected with bitcoind!")
logger(appConfig.nodeConf)
.debug(s"Done with teardown of node connected with bitcoind!")
()
}

View file

@ -21,7 +21,9 @@ import scala.util.Properties
class WalletAppConfigTest extends BitcoinSAsyncTest {
val tempDir = Files.createTempDirectory("bitcoin-s")
val config = WalletAppConfig(directory = tempDir)
val config: WalletAppConfig =
WalletAppConfig(directory = tempDir, useLogbackConf = false)
it must "resolve DB connections correctly " in {
assert(config.dbPath.startsWith(Properties.tmpDir))
@ -46,7 +48,8 @@ class WalletAppConfigTest extends BitcoinSAsyncTest {
|}
|""".stripMargin)
val throughConstuctor = WalletAppConfig(tempDir, overrider)
val throughConstuctor =
WalletAppConfig(tempDir, useLogbackConf = false, overrider)
val throughWithOverrides = config.withOverrides(overrider)
assert(throughWithOverrides.network == MainNet)
assert(throughWithOverrides.network == throughConstuctor.network)
@ -97,7 +100,7 @@ class WalletAppConfigTest extends BitcoinSAsyncTest {
""".stripMargin
val _ = Files.write(tempFile, confStr.getBytes())
val appConfig = WalletAppConfig(directory = tempDir)
val appConfig = WalletAppConfig(directory = tempDir, useLogbackConf = false)
assert(appConfig.datadir == tempDir.resolve("testnet3"))
assert(appConfig.network == TestNet3)

View file

@ -1,12 +1,12 @@
package org.bitcoins.wallet
import org.bitcoins.wallet.config.WalletAppConfig
import org.bitcoins.db.{AppLoggers, MarkedLogger}
import org.bitcoins.db.{AppLoggers, LoggerConfig}
import org.slf4j.Logger
/** Exposes acccess to the wallet logger */
private[bitcoins] trait WalletLogger {
private var _logger: MarkedLogger = _
protected[bitcoins] def logger(implicit config: WalletAppConfig) = {
private var _logger: Logger = _
protected[bitcoins] def logger(implicit config: LoggerConfig): Logger = {
if (_logger == null) {
_logger = WalletLoggerImpl(config).getLogger
}
@ -14,12 +14,12 @@ private[bitcoins] trait WalletLogger {
}
}
private[wallet] case class WalletLoggerImpl(override val conf: WalletAppConfig)
private[wallet] case class WalletLoggerImpl(override val conf: LoggerConfig)
extends AppLoggers {
/**
* @return the generic wallet logger (i.e. everything not related to key handling)
*/
def getLogger: MarkedLogger =
def getLogger: Logger =
getLoggerImpl(LoggerKind.Wallet)
}

View file

@ -19,6 +19,7 @@ import scala.concurrent.{ExecutionContext, Future}
*/
case class WalletAppConfig(
private val directory: Path,
override val useLogbackConf: Boolean,
private val conf: Config*)(implicit override val ec: ExecutionContext)
extends AppConfig
with WalletDbManagement
@ -28,7 +29,7 @@ case class WalletAppConfig(
override protected[bitcoins] type ConfigType = WalletAppConfig
override protected[bitcoins] def newConfigOfType(
configs: Seq[Config]): WalletAppConfig =
WalletAppConfig(directory, configs: _*)
WalletAppConfig(directory, useLogbackConf, configs: _*)
protected[bitcoins] def baseDatadir: Path = directory
@ -131,7 +132,9 @@ object WalletAppConfig {
/** Constructs a wallet configuration from the default Bitcoin-S
* data directory and given list of configuration overrides.
*/
def fromDefaultDatadir(confs: Config*)(
def fromDefaultDatadir(useLogbackConf: Boolean, confs: Config*)(
implicit ec: ExecutionContext): WalletAppConfig =
WalletAppConfig(AppConfig.DEFAULT_BITCOIN_S_DATADIR, confs: _*)
WalletAppConfig(AppConfig.DEFAULT_BITCOIN_S_DATADIR,
useLogbackConf,
confs: _*)
}