github.com/franklinhu/terraform@v0.6.9-0.20151202232446-81f7fb1e6f9e/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 }