decred.org/dcrwallet/v3@v3.1.0/log.go (about)

     1  // Copyright (c) 2013-2017 The btcsuite developers
     2  // Copyright (c) 2015-2018 The Decred developers
     3  // Use of this source code is governed by an ISC
     4  // license that can be found in the LICENSE file.
     5  
     6  package main
     7  
     8  import (
     9  	"os"
    10  
    11  	"decred.org/dcrwallet/v3/chain"
    12  	"decred.org/dcrwallet/v3/internal/loader"
    13  	"decred.org/dcrwallet/v3/internal/loggers"
    14  	"decred.org/dcrwallet/v3/internal/rpc/jsonrpc"
    15  	"decred.org/dcrwallet/v3/internal/rpc/rpcserver"
    16  	"decred.org/dcrwallet/v3/internal/vsp"
    17  	"decred.org/dcrwallet/v3/p2p"
    18  	"decred.org/dcrwallet/v3/spv"
    19  	"decred.org/dcrwallet/v3/ticketbuyer"
    20  	"decred.org/dcrwallet/v3/wallet"
    21  	"decred.org/dcrwallet/v3/wallet/udb"
    22  	"github.com/decred/dcrd/connmgr/v3"
    23  	"github.com/decred/slog"
    24  )
    25  
    26  var log = loggers.MainLog
    27  
    28  // Initialize package-global logger variables.
    29  func init() {
    30  	loader.UseLogger(loggers.LoaderLog)
    31  	wallet.UseLogger(loggers.WalletLog)
    32  	udb.UseLogger(loggers.WalletLog)
    33  	ticketbuyer.UseLogger(loggers.TkbyLog)
    34  	chain.UseLogger(loggers.SyncLog)
    35  	spv.UseLogger(loggers.SyncLog)
    36  	p2p.UseLogger(loggers.SyncLog)
    37  	rpcserver.UseLogger(loggers.GrpcLog)
    38  	jsonrpc.UseLogger(loggers.JsonrpcLog)
    39  	connmgr.UseLogger(loggers.CmgrLog)
    40  	vsp.UseLogger(loggers.VspcLog)
    41  }
    42  
    43  // subsystemLoggers maps each subsystem identifier to its associated logger.
    44  var subsystemLoggers = map[string]slog.Logger{
    45  	"DCRW": loggers.MainLog,
    46  	"LODR": loggers.LoaderLog,
    47  	"WLLT": loggers.WalletLog,
    48  	"TKBY": loggers.TkbyLog,
    49  	"SYNC": loggers.SyncLog,
    50  	"GRPC": loggers.GrpcLog,
    51  	"RPCS": loggers.JsonrpcLog,
    52  	"CMGR": loggers.CmgrLog,
    53  	"VSPC": loggers.VspcLog,
    54  }
    55  
    56  // setLogLevel sets the logging level for provided subsystem.  Invalid
    57  // subsystems are ignored.  Uninitialized subsystems are dynamically created as
    58  // needed.
    59  func setLogLevel(subsystemID string, logLevel string) {
    60  	// Ignore invalid subsystems.
    61  	logger, ok := subsystemLoggers[subsystemID]
    62  	if !ok {
    63  		return
    64  	}
    65  
    66  	// Defaults to info if the log level is invalid.
    67  	level, _ := slog.LevelFromString(logLevel)
    68  	logger.SetLevel(level)
    69  }
    70  
    71  // setLogLevels sets the log level for all subsystem loggers to the passed
    72  // level.  It also dynamically creates the subsystem loggers as needed, so it
    73  // can be used to initialize the logging system.
    74  func setLogLevels(logLevel string) {
    75  	// Configure all sub-systems with the new logging level.  Dynamically
    76  	// create loggers as needed.
    77  	for subsystemID := range subsystemLoggers {
    78  		setLogLevel(subsystemID, logLevel)
    79  	}
    80  }
    81  
    82  // fatalf logs a message, flushes the logger, and finally exit the process with
    83  // a non-zero return code.
    84  func fatalf(format string, args ...interface{}) {
    85  	log.Errorf(format, args...)
    86  	os.Stdout.Sync()
    87  	loggers.CloseLogRotator()
    88  	os.Exit(1)
    89  }