github.com/xwi88/log4go@v0.0.6/config.go (about)

     1  package log4go
     2  
     3  import (
     4  	"encoding/json"
     5  	"io/ioutil"
     6  	"log"
     7  	"os"
     8  )
     9  
    10  // GlobalLevel global level
    11  var GlobalLevel = DEBUG
    12  
    13  const (
    14  	WriterNameConsole = "console_writer"
    15  	WriterNameFile    = "file_writer"
    16  	WriterNameKafka   = "kafka_writer"
    17  )
    18  
    19  // LogConfig log config
    20  type LogConfig struct {
    21  	Level         string               `json:"level" mapstructure:"level"`
    22  	Debug         bool                 `json:"debug" mapstructure:"debug"` // output log info or not for log4go
    23  	FullPath      bool                 `json:"full_path" mapstructure:"full_path"`
    24  	ConsoleWriter ConsoleWriterOptions `json:"console_writer" mapstructure:"console_writer"`
    25  	FileWriter    FileWriterOptions    `json:"file_writer" mapstructure:"file_writer"`
    26  	KafKaWriter   KafKaWriterOptions   `json:"kafka_writer" mapstructure:"kafka_writer"`
    27  }
    28  
    29  // SetupLog setup log
    30  func SetupLog(lc LogConfig) (err error) {
    31  	if !lc.Debug {
    32  		log.SetOutput(ioutil.Discard)
    33  		defer log.SetOutput(os.Stdout)
    34  	}
    35  
    36  	// global config
    37  	GlobalLevel = getLevel(lc.Level)
    38  
    39  	// writer enable
    40  	// 1. if not set level, use global level;
    41  	// 2. if set level, use min level
    42  	validGlobalMinLevel := EMERGENCY // default max level
    43  	validGlobalMinLevelBy := "global"
    44  
    45  	fileWriterLevelDefault := GlobalLevel
    46  	consoleWriterLevelDefault := GlobalLevel
    47  	kafkaWriterLevelDefault := GlobalLevel
    48  
    49  	if lc.ConsoleWriter.Enable {
    50  		consoleWriterLevelDefault = getLevelDefault(lc.ConsoleWriter.Level, GlobalLevel, WriterNameConsole)
    51  		validGlobalMinLevel = maxInt(consoleWriterLevelDefault, validGlobalMinLevel)
    52  		if validGlobalMinLevel == consoleWriterLevelDefault {
    53  			validGlobalMinLevelBy = WriterNameConsole
    54  		}
    55  	}
    56  
    57  	if lc.FileWriter.Enable {
    58  		fileWriterLevelDefault = getLevelDefault(lc.FileWriter.Level, GlobalLevel, WriterNameFile)
    59  		validGlobalMinLevel = maxInt(fileWriterLevelDefault, validGlobalMinLevel)
    60  		if validGlobalMinLevel == fileWriterLevelDefault {
    61  			validGlobalMinLevelBy = WriterNameFile
    62  		}
    63  	}
    64  
    65  	if lc.KafKaWriter.Enable {
    66  		kafkaWriterLevelDefault = getLevelDefault(lc.KafKaWriter.Level, GlobalLevel, WriterNameKafka)
    67  		validGlobalMinLevel = maxInt(kafkaWriterLevelDefault, validGlobalMinLevel)
    68  		if validGlobalMinLevel == kafkaWriterLevelDefault {
    69  			validGlobalMinLevelBy = WriterNameKafka
    70  		}
    71  	}
    72  
    73  	fullPath := lc.FullPath
    74  	WithFullPath(fullPath)
    75  	SetLevel(validGlobalMinLevel)
    76  
    77  	if lc.ConsoleWriter.Enable {
    78  		w := NewConsoleWriterWithOptions(lc.ConsoleWriter)
    79  		w.level = consoleWriterLevelDefault
    80  		log.Printf("[log4go] enable " + WriterNameConsole + " with level " + LevelFlags[consoleWriterLevelDefault])
    81  		Register(w)
    82  	}
    83  
    84  	if lc.FileWriter.Enable {
    85  		w := NewFileWriterWithOptions(lc.FileWriter)
    86  		w.level = fileWriterLevelDefault
    87  		log.Printf("[log4go] enable    " + WriterNameFile + " with level " + LevelFlags[fileWriterLevelDefault])
    88  		Register(w)
    89  	}
    90  
    91  	if lc.KafKaWriter.Enable {
    92  		w := NewKafKaWriter(lc.KafKaWriter)
    93  		w.level = kafkaWriterLevelDefault
    94  		log.Printf("[log4go] enable   " + WriterNameKafka + " with level " + LevelFlags[kafkaWriterLevelDefault])
    95  		Register(w)
    96  	}
    97  
    98  	log.Printf("[log4go] valid global_level(min:%v, flag:%v, by:%v), default(%v, flag:%v)",
    99  		validGlobalMinLevel, LevelFlags[validGlobalMinLevel], validGlobalMinLevelBy, GlobalLevel, LevelFlags[GlobalLevel])
   100  	return nil
   101  }
   102  
   103  // SetLogWithConf setup log with config file
   104  func SetLogWithConf(file string) (err error) {
   105  	var lc LogConfig
   106  	cnt, err := ioutil.ReadFile(file)
   107  
   108  	if err = json.Unmarshal(cnt, &lc); err != nil {
   109  		return
   110  	}
   111  	return SetupLog(lc)
   112  }
   113  
   114  // SetLog setup log with config []byte
   115  func SetLog(config []byte) (err error) {
   116  	var lc LogConfig
   117  	if err = json.Unmarshal(config, &lc); err != nil {
   118  		return
   119  	}
   120  	return SetupLog(lc)
   121  }
   122  
   123  func getLevel(flag string) int {
   124  	return getLevelDefault(flag, DEBUG, "")
   125  }
   126  
   127  // maxInt return max int
   128  func maxInt(a, b int) int {
   129  	if a < b {
   130  		return b
   131  	}
   132  	return a
   133  }