go.mondoo.com/cnquery@v0.0.0-20231005093811-59568235f6ea/logger/log.go (about)

     1  // copyright: 2019, Dominik Richter and Christoph Hartmann
     2  // author: Dominik Richter
     3  // author: Christoph Hartmann
     4  
     5  package logger
     6  
     7  import (
     8  	"io"
     9  	"os"
    10  	"time"
    11  
    12  	"github.com/rs/zerolog"
    13  	"github.com/rs/zerolog/log"
    14  )
    15  
    16  // we use colorable to support color output on windows
    17  // we buffer it by default, so that tui components can interrupt cli logger
    18  var LogOutputWriter = NewBufferedWriter(os.Stderr)
    19  
    20  // Debug is set to true if the application is running in a debug mode
    21  var Debug bool
    22  
    23  // SetWriter configures a log writer for the global logger
    24  func SetWriter(w io.Writer) {
    25  	log.Logger = log.Output(w)
    26  }
    27  
    28  // UseJSONLogging for global logger
    29  func UseJSONLogging(out io.Writer) {
    30  	log.Logger = zerolog.New(out).With().Timestamp().Logger()
    31  }
    32  
    33  // UseGCPJSONLogging for global logger. This is a JSON logger
    34  // with field names GCP will recognize
    35  func UseGCPJSONLogging(out io.Writer) {
    36  	zerolog.LevelFieldName = "severity"
    37  	zerolog.TimestampFieldName = "timestamp"
    38  	zerolog.TimeFieldFormat = time.RFC3339Nano
    39  
    40  	log.Logger = zerolog.New(out).With().Timestamp().Logger()
    41  }
    42  
    43  // CliLogger sets the global logger to the console logger with color
    44  func CliLogger() {
    45  	log.Logger = NewConsoleWriter(LogOutputWriter, false)
    46  }
    47  
    48  func CliCompactLogger(out io.Writer) {
    49  	log.Logger = NewConsoleWriter(out, true)
    50  }
    51  
    52  func StandardZerologLogger() {
    53  	log.Logger = log.Output(zerolog.ConsoleWriter{Out: os.Stderr, TimeFormat: time.RFC3339})
    54  }
    55  
    56  // Set will set up the logger
    57  func Set(level string) {
    58  	switch level {
    59  	case "error":
    60  		zerolog.SetGlobalLevel(zerolog.ErrorLevel)
    61  	case "warn":
    62  		zerolog.SetGlobalLevel(zerolog.WarnLevel)
    63  	case "info":
    64  		zerolog.SetGlobalLevel(zerolog.InfoLevel)
    65  	case "debug":
    66  		zerolog.SetGlobalLevel(zerolog.DebugLevel)
    67  	case "trace":
    68  		zerolog.SetGlobalLevel(zerolog.TraceLevel)
    69  	case "":
    70  		zerolog.SetGlobalLevel(zerolog.InfoLevel)
    71  	default:
    72  		log.Error().Msg("unknown log level: " + level)
    73  	}
    74  }
    75  
    76  func GetLevel() string {
    77  	return zerolog.GlobalLevel().String()
    78  }
    79  
    80  // InitTestEnv will set all log configurations for a test environment
    81  // verbose and colorful
    82  func InitTestEnv() {
    83  	Set("debug")
    84  	log.Logger = log.Output(zerolog.ConsoleWriter{Out: os.Stderr, NoColor: true})
    85  }
    86  
    87  // GetEnvLogLevel determines the loglevel from env vars DEBUG or TRACE are set
    88  func GetEnvLogLevel() (string, bool) {
    89  	level := ""
    90  	ok := false
    91  
    92  	if os.Getenv("DEBUG") == "true" || os.Getenv("DEBUG") == "1" {
    93  		level = "debug"
    94  		ok = true
    95  	}
    96  
    97  	if os.Getenv("TRACE") == "true" || os.Getenv("TRACE") == "1" {
    98  		level = "trace"
    99  		ok = true
   100  	}
   101  
   102  	return level, ok
   103  }