github.com/keltia/go-ipfs@v0.3.8-0.20150909044612-210793031c63/util/log.go (about)

     1  package util
     2  
     3  import (
     4  	"os"
     5  
     6  	"github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/Sirupsen/logrus"
     7  )
     8  
     9  func init() {
    10  	SetupLogging()
    11  }
    12  
    13  var log = logrus.New()
    14  
    15  // LogFormats is a map of formats used for our logger, keyed by name.
    16  // TODO: write custom TextFormatter (don't print module=name explicitly) and
    17  // fork logrus to add shortfile
    18  var LogFormats = map[string]*logrus.TextFormatter{
    19  	"nocolor": {DisableColors: true, FullTimestamp: true, TimestampFormat: "2006-01-02 15:04:05.000000", DisableSorting: true},
    20  	"color":   {DisableColors: false, FullTimestamp: true, TimestampFormat: "15:04:05:000", DisableSorting: true},
    21  }
    22  var defaultLogFormat = "color"
    23  
    24  // Logging environment variables
    25  const (
    26  	envLogging    = "IPFS_LOGGING"
    27  	envLoggingFmt = "IPFS_LOGGING_FMT"
    28  )
    29  
    30  // loggers is the set of loggers in the system
    31  var loggers = map[string]*logrus.Entry{}
    32  
    33  // SetupLogging will initialize the logger backend and set the flags.
    34  func SetupLogging() {
    35  
    36  	format, ok := LogFormats[os.Getenv(envLoggingFmt)]
    37  	if !ok {
    38  		format = LogFormats[defaultLogFormat]
    39  	}
    40  
    41  	log.Out = os.Stderr
    42  	log.Formatter = format
    43  
    44  	lvl := logrus.ErrorLevel
    45  
    46  	if logenv := os.Getenv(envLogging); logenv != "" {
    47  		var err error
    48  		lvl, err = logrus.ParseLevel(logenv)
    49  		if err != nil {
    50  			log.Debugf("logrus.ParseLevel() Error: %q", err)
    51  			lvl = logrus.ErrorLevel // reset to ERROR, could be undefined now(?)
    52  		}
    53  	}
    54  
    55  	if Debug := GetenvBool("IPFS_DEBUG"); Debug {
    56  		lvl = logrus.DebugLevel
    57  	}
    58  
    59  	SetAllLoggers(lvl)
    60  }
    61  
    62  // SetDebugLogging calls SetAllLoggers with logrus.DebugLevel
    63  func SetDebugLogging() {
    64  	SetAllLoggers(logrus.DebugLevel)
    65  }
    66  
    67  // SetAllLoggers changes the logrus.Level of all loggers to lvl
    68  func SetAllLoggers(lvl logrus.Level) {
    69  	log.Level = lvl
    70  	for _, logger := range loggers {
    71  		logger.Level = lvl
    72  	}
    73  }
    74  
    75  // Logger retrieves a particular logger
    76  func Logger(name string) *logrus.Entry {
    77  	if len(name) == 0 {
    78  		log.Warnf("Missing name parameter")
    79  		name = "undefined"
    80  	}
    81  	if _, ok := loggers[name]; !ok {
    82  		loggers[name] = log.WithField("module", name)
    83  	}
    84  	return loggers[name]
    85  }
    86  
    87  // SetLogLevel changes the log level of a specific subsystem
    88  // name=="*" changes all subsystems
    89  func SetLogLevel(name, level string) error {
    90  	lvl, err := logrus.ParseLevel(level)
    91  	if err != nil {
    92  		return err
    93  	}
    94  
    95  	// wildcard, change all
    96  	if name == "*" {
    97  		SetAllLoggers(lvl)
    98  		return nil
    99  	}
   100  
   101  	// Check if we have a logger by that name
   102  	if _, ok := loggers[name]; !ok {
   103  		return ErrNoSuchLogger
   104  	}
   105  
   106  	loggers[name].Level = lvl
   107  
   108  	return nil
   109  }