github.com/wangzhucn/terraform@v0.6.7-0.20151109233120-4eea011b56b3/log.go (about)

     1  package main
     2  
     3  import (
     4  	"io"
     5  	"log"
     6  	"os"
     7  	"strings"
     8  
     9  	"github.com/hashicorp/logutils"
    10  )
    11  
    12  // These are the environmental variables that determine if we log, and if
    13  // we log whether or not the log should go to a file.
    14  const (
    15  	EnvLog     = "TF_LOG"      // Set to True
    16  	EnvLogFile = "TF_LOG_PATH" // Set to a file
    17  )
    18  
    19  var validLevels = []logutils.LogLevel{"TRACE", "DEBUG", "INFO", "WARN", "ERROR"}
    20  
    21  // logOutput determines where we should send logs (if anywhere) and the log level.
    22  func logOutput() (logOutput io.Writer, err error) {
    23  	logOutput = nil
    24  	envLevel := os.Getenv(EnvLog)
    25  	if envLevel == "" {
    26  		return
    27  	}
    28  
    29  	logOutput = os.Stderr
    30  	if logPath := os.Getenv(EnvLogFile); logPath != "" {
    31  		var err error
    32  		logOutput, err = os.Create(logPath)
    33  		if err != nil {
    34  			return nil, err
    35  		}
    36  	}
    37  
    38  	// This was the default since the beginning
    39  	logLevel := logutils.LogLevel("TRACE")
    40  
    41  	if isValidLogLevel(envLevel) {
    42  		// allow following for better ux: info, Info or INFO
    43  		logLevel = logutils.LogLevel(strings.ToUpper(envLevel))
    44  	} else {
    45  		log.Printf("[WARN] Invalid log level: %q. Defaulting to level: TRACE. Valid levels are: %+v",
    46  			envLevel, validLevels)
    47  	}
    48  
    49  	logOutput = &logutils.LevelFilter{
    50  		Levels:   validLevels,
    51  		MinLevel: logLevel,
    52  		Writer:   logOutput,
    53  	}
    54  
    55  	return
    56  }
    57  
    58  func isValidLogLevel(level string) bool {
    59  	for _, l := range validLevels {
    60  		if strings.ToUpper(level) == string(l) {
    61  			return true
    62  		}
    63  	}
    64  
    65  	return false
    66  }