github.com/status-im/status-go@v1.1.0/logutils/override.go (about)

     1  package logutils
     2  
     3  import (
     4  	"os"
     5  	"strings"
     6  
     7  	logging "github.com/ipfs/go-log/v2"
     8  
     9  	"github.com/ethereum/go-ethereum/log"
    10  )
    11  
    12  type LogSettings struct {
    13  	Enabled         bool   `json:"Enabled"`
    14  	MobileSystem    bool   `json:"MobileSystem"`
    15  	Level           string `json:"Level"`
    16  	File            string `json:"File"`
    17  	MaxSize         int    `json:"MaxSize"`
    18  	MaxBackups      int    `json:"MaxBackups"`
    19  	CompressRotated bool   `json:"CompressRotated"`
    20  }
    21  
    22  // OverrideWithStdLogger overwrites ethereum's root logger with a logger from golang std lib.
    23  func OverrideWithStdLogger(logLevel string) error {
    24  	return enableRootLog(logLevel, NewStdHandler(log.TerminalFormat(false)))
    25  }
    26  
    27  // OverrideRootLogWithConfig derives all configuration from params.NodeConfig and configures logger using it.
    28  func OverrideRootLogWithConfig(settings LogSettings, colors bool) error {
    29  	if !settings.Enabled {
    30  		return nil
    31  	}
    32  	if settings.MobileSystem {
    33  		return OverrideWithStdLogger(settings.Level)
    34  	}
    35  	return OverrideRootLog(settings.Enabled, settings.Level, FileOptions{
    36  		Filename:   settings.File,
    37  		MaxSize:    settings.MaxSize,
    38  		MaxBackups: settings.MaxBackups,
    39  		Compress:   settings.CompressRotated,
    40  	}, colors)
    41  
    42  }
    43  
    44  // OverrideRootLog overrides root logger with file handler, if defined,
    45  // and log level (defaults to INFO).
    46  func OverrideRootLog(enabled bool, levelStr string, fileOpts FileOptions, terminal bool) error {
    47  	if !enabled {
    48  		disableRootLog()
    49  		return nil
    50  	}
    51  	if os.Getenv("CI") == "true" {
    52  		terminal = false
    53  	}
    54  	var (
    55  		handler log.Handler
    56  	)
    57  	if fileOpts.Filename != "" {
    58  		if fileOpts.MaxBackups == 0 {
    59  			// Setting MaxBackups to 0 causes all log files to be kept. Even setting MaxAge to > 0 doesn't fix it
    60  			// Docs: https://pkg.go.dev/gopkg.in/natefinch/lumberjack.v2@v2.0.0#readme-cleaning-up-old-log-files
    61  			fileOpts.MaxBackups = 1
    62  		}
    63  		handler = FileHandlerWithRotation(fileOpts, log.TerminalFormat(terminal))
    64  	} else {
    65  		handler = log.StreamHandler(os.Stderr, log.TerminalFormat(terminal))
    66  	}
    67  
    68  	return enableRootLog(levelStr, handler)
    69  }
    70  
    71  func disableRootLog() {
    72  	log.Root().SetHandler(log.DiscardHandler())
    73  }
    74  
    75  func enableRootLog(levelStr string, handler log.Handler) error {
    76  	if levelStr == "" {
    77  		levelStr = "INFO"
    78  	}
    79  
    80  	levelStr = strings.ToLower(levelStr)
    81  
    82  	level, err := log.LvlFromString(levelStr)
    83  	if err != nil {
    84  		return err
    85  	}
    86  
    87  	filteredHandler := log.LvlFilterHandler(level, handler)
    88  	log.Root().SetHandler(filteredHandler)
    89  	log.PrintOrigins(true)
    90  
    91  	// go-libp2p logger
    92  	lvl, err := logging.LevelFromString(levelStr)
    93  	if err != nil {
    94  		return err
    95  	}
    96  
    97  	logging.SetAllLoggers(lvl)
    98  
    99  	return nil
   100  }